update wlcompat for new ioctl interface (fixes #1357)
authorFelix Fietkau <nbd@openwrt.org>
Sat, 30 Jun 2007 13:33:23 +0000 (13:33 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Sat, 30 Jun 2007 13:33:23 +0000 (13:33 +0000)
SVN-Revision: 7795

17 files changed:
package/wlcompat/Makefile
package/wlcompat/src/include/bcmdefs.h [new file with mode: 0644]
package/wlcompat/src/include/bcmnvram.h [deleted file]
package/wlcompat/src/include/bcmutils.h
package/wlcompat/src/include/cy_conf.h [deleted file]
package/wlcompat/src/include/epivers.h [deleted file]
package/wlcompat/src/include/proto/802.11.h
package/wlcompat/src/include/proto/bcmeth.h [new file with mode: 0644]
package/wlcompat/src/include/proto/bcmevent.h [new file with mode: 0644]
package/wlcompat/src/include/proto/ethernet.h
package/wlcompat/src/include/proto/wpa.h [new file with mode: 0644]
package/wlcompat/src/include/shutils.h [deleted file]
package/wlcompat/src/include/typedefs.h
package/wlcompat/src/include/utils.h [deleted file]
package/wlcompat/src/include/wlioctl.h
package/wlcompat/src/include/wlutils.h
package/wlcompat/src/wlcompat.c

index 02ad5469c4a3cfd43214582d5ce484071dd28773..1870c99d0f89776f87101a799a7820f56d51ce04 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=kmod-wlcompat
-PKG_RELEASE:=4
+PKG_RELEASE:=5
 
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)
 
diff --git a/package/wlcompat/src/include/bcmdefs.h b/package/wlcompat/src/include/bcmdefs.h
new file mode 100644 (file)
index 0000000..8b5abe5
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Misc system wide definitions
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ * $Id: bcmdefs.h,v 1.1.1.3 2006/04/08 06:13:39 honor Exp $
+ */
+
+#ifndef        _bcmdefs_h_
+#define        _bcmdefs_h_
+
+/*
+ * One doesn't need to include this file explicitly, gets included automatically if
+ * typedefs.h is included.
+ */
+
+/* Reclaiming text and data :
+ * The following macros specify special linker sections that can be reclaimed
+ * after a system is considered 'up'.
+ */
+#if defined(__GNUC__) && defined(BCMRECLAIM)
+extern bool    bcmreclaimed;
+#define BCMINITDATA(_data)     __attribute__ ((__section__ (".dataini." #_data))) _data
+#define BCMINITFN(_fn)         __attribute__ ((__section__ (".textini." #_fn))) _fn
+#else /* #if defined(__GNUC__) && defined(BCMRECLAIM) */
+#define BCMINITDATA(_data)     _data
+#define BCMINITFN(_fn)         _fn
+#define bcmreclaimed           0
+#endif /* #if defined(__GNUC__) && defined(BCMRECLAIM) */
+
+/* Reclaim uninit functions if BCMNODOWN is defined            */
+/* and if they are not already removed by -gc-sections */
+#ifdef BCMNODOWN
+#define BCMUNINITFN(_fn)               BCMINITFN(_fn)
+#else
+#define BCMUNINITFN(_fn)               _fn
+#endif
+
+#ifdef BCMRECLAIM
+#define CONST
+#else
+#define CONST  const
+#endif /* BCMRECLAIM */
+
+/* Compatibility with old-style BCMRECLAIM */
+#define BCMINIT(_id)           _id
+
+
+/* Put some library data/code into ROM to reduce RAM requirements */
+#if defined(__GNUC__) && defined(BCMROMOFFLOAD)
+#define BCMROMDATA(_data)      __attribute__ ((__section__ (".datarom." #_data))) _data
+#define BCMROMFN(_fn)          __attribute__ ((__section__ (".textrom." #_fn))) _fn
+#else
+#define BCMROMDATA(_data)      _data
+#define BCMROMFN(_fn)          _fn
+#endif
+
+/* Bus types */
+#define        SB_BUS                  0       /* Silicon Backplane */
+#define        PCI_BUS                 1       /* PCI target */
+#define        PCMCIA_BUS              2       /* PCMCIA target */
+#define SDIO_BUS               3       /* SDIO target */
+#define JTAG_BUS               4       /* JTAG */
+#define NO_BUS                 0xFF    /* Bus that does not support R/W REG */
+
+/* Allows optimization for single-bus support */
+#ifdef BCMBUSTYPE
+#define BUSTYPE(bus) (BCMBUSTYPE)
+#else
+#define BUSTYPE(bus) (bus)
+#endif
+
+/* Defines for DMA Address Width - Shared between OSL and HNDDMA */
+#define DMADDR_MASK_32 0x0             /* Address mask for 32-bits */
+#define DMADDR_MASK_30 0xc0000000      /* Address mask for 30-bits */
+#define DMADDR_MASK_0  0xffffffff      /* Address mask for 0-bits (hi-part) */
+
+#define        DMADDRWIDTH_30  30 /* 30-bit addressing capability */
+#define        DMADDRWIDTH_32  32 /* 32-bit addressing capability */
+#define        DMADDRWIDTH_63  63 /* 64-bit addressing capability */
+#define        DMADDRWIDTH_64  64 /* 64-bit addressing capability */
+
+/* packet headroom necessary to accomodate the largest header in the system, (i.e TXOFF).
+ * By doing, we avoid the need  to allocate an extra buffer for the header when bridging to WL.
+ * There is a compile time check in wlc.c which ensure that this value is at least as big
+ * as TXOFF. This value is used in dma_rxfill (hnddma.c).
+ */
+#define BCMEXTRAHDROOM 160
+
+/* Headroom required for dongle-to-host communication.  Packets allocated
+ * locally in the dongle (e.g. for CDC ioctls or RNDIS messages) should
+ * leave this much room in front for low-level message headers which may
+ * be needed to get across the dongle bus to the host.  (These messages
+ * don't go over the network, so room for the full WL header above would
+ * be a waste.)
+ */
+#define BCMDONGLEHDRSZ 8
+
+
+
+#endif /* _bcmdefs_h_ */
diff --git a/package/wlcompat/src/include/bcmnvram.h b/package/wlcompat/src/include/bcmnvram.h
deleted file mode 100644 (file)
index 3c45263..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * NVRAM variable manipulation
- *
- * Copyright 2004, Broadcom Corporation
- * All Rights Reserved.
- * 
- * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
- * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
- * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
- *
- * $Id$
- */
-
-#ifndef _bcmnvram_h_
-#define _bcmnvram_h_
-
-#ifndef _LANGUAGE_ASSEMBLY
-
-#include <typedefs.h>
-
-struct nvram_header {
-       uint32 magic;
-       uint32 len;
-       uint32 crc_ver_init;    /* 0:7 crc, 8:15 ver, 16:27 init, mem. test 28, 29-31 reserved */
-       uint32 config_refresh;  /* 0:15 config, 16:31 refresh */
-       uint32 config_ncdl;     /* ncdl values for memc */
-};
-
-struct nvram_tuple {
-       char *name;
-       char *value;
-       struct nvram_tuple *next;
-};
-
-/*
- * Initialize NVRAM access. May be unnecessary or undefined on certain
- * platforms.
- */
-extern int nvram_init(void *sbh);
-
-/*
- * Disable NVRAM access. May be unnecessary or undefined on certain
- * platforms.
- */
-extern void nvram_exit(void);
-
-/*
- * Get the value of an NVRAM variable. The pointer returned may be
- * invalid after a set.
- * @param      name    name of variable to get
- * @return     value of variable or NULL if undefined
- */
-extern char * nvram_get(const char *name);
-
-/* 
- * Get the value of an NVRAM variable.
- * @param      name    name of variable to get
- * @return     value of variable or NUL if undefined
- */
-#define nvram_safe_get(name) (nvram_get(name) ? : "")
-
-#define nvram_safe_unset(name) ({ \
-       if(nvram_get(name)) \
-               nvram_unset(name); \
-})
-
-#define nvram_safe_set(name, value) ({ \
-       if(!nvram_get(name) || strcmp(nvram_get(name), value)) \
-               nvram_set(name, value); \
-})
-
-/*
- * Match an NVRAM variable.
- * @param      name    name of variable to match
- * @param      match   value to compare against value of variable
- * @return     TRUE if variable is defined and its value is string equal
- *             to match or FALSE otherwise
- */
-static INLINE int
-nvram_match(char *name, char *match) {
-       const char *value = nvram_get(name);
-       return (value && !strcmp(value, match));
-}
-
-/*
- * Inversely match an NVRAM variable.
- * @param      name    name of variable to match
- * @param      match   value to compare against value of variable
- * @return     TRUE if variable is defined and its value is not string
- *             equal to invmatch or FALSE otherwise
- */
-static INLINE int
-nvram_invmatch(char *name, char *invmatch) {
-       const char *value = nvram_get(name);
-       return (value && strcmp(value, invmatch));
-}
-
-/*
- * Set the value of an NVRAM variable. The name and value strings are
- * copied into private storage. Pointers to previously set values
- * may become invalid. The new value may be immediately
- * retrieved but will not be permanently stored until a commit.
- * @param      name    name of variable to set
- * @param      value   value of variable
- * @return     0 on success and errno on failure
- */
-extern int nvram_set(const char *name, const char *value);
-
-/*
- * Unset an NVRAM variable. Pointers to previously set values
- * remain valid until a set.
- * @param      name    name of variable to unset
- * @return     0 on success and errno on failure
- * NOTE: use nvram_commit to commit this change to flash.
- */
-extern int nvram_unset(const char *name);
-
-/*
- * Commit NVRAM variables to permanent storage. All pointers to values
- * may be invalid after a commit.
- * NVRAM values are undefined after a commit.
- * @return     0 on success and errno on failure
- */
-extern int nvram_commit(void);
-
-/*
- * Get all NVRAM variables (format name=value\0 ... \0\0).
- * @param      buf     buffer to store variables
- * @param      count   size of buffer in bytes
- * @return     0 on success and errno on failure
- */
-extern int nvram_getall(char *buf, int count);
-
-extern int file2nvram(char *filename, char *varname);
-extern int nvram2file(char *varname, char *filename);
-
-#endif /* _LANGUAGE_ASSEMBLY */
-
-#define NVRAM_MAGIC            0x48534C46      /* 'FLSH' */
-#define NVRAM_VERSION          1
-#define NVRAM_HEADER_SIZE      20
-#define NVRAM_SPACE            0x8000
-#define FLASH_BASE             0xbfc00000      /* Extif core */
-#define FLASH_MIN              0x00100000      /* Minimum flash size */
-#define FLASH_MAX              0x00400000      /* Maximum flash size with extif */
-
-#endif /* _bcmnvram_h_ */
index 05ad41d9d800f9b6db6b7c91dba5c5179bdefbef..0286e7c9cbf9ee5db9d22547a3be486f86e7152d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Misc useful os-independent macros and functions.
  *
- * Copyright 2004, Broadcom Corporation
+ * Copyright 2006, Broadcom Corporation
  * All Rights Reserved.
  * 
  * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
 #ifndef        _bcmutils_h_
 #define        _bcmutils_h_
 
+/* ** driver/apps-shared section ** */
+
+#define BCME_STRLEN            64      /* Max string length for BCM errors */
+#define VALID_BCMERROR(e)  ((e <= 0) && (e >= BCME_LAST))
+
+
+/*
+ * error codes could be added but the defined ones shouldn't be changed/deleted
+ * these error codes are exposed to the user code
+ * when ever a new error code is added to this list
+ * please update errorstring table with the related error string and
+ * update osl files with os specific errorcode map
+*/
+
+#define BCME_OK                                0       /* Success */
+#define BCME_ERROR                     -1      /* Error generic */
+#define BCME_BADARG                    -2      /* Bad Argument */
+#define BCME_BADOPTION                 -3      /* Bad option */
+#define BCME_NOTUP                     -4      /* Not up */
+#define BCME_NOTDOWN                   -5      /* Not down */
+#define BCME_NOTAP                     -6      /* Not AP */
+#define BCME_NOTSTA                    -7      /* Not STA  */
+#define BCME_BADKEYIDX                 -8      /* BAD Key Index */
+#define BCME_RADIOOFF                  -9      /* Radio Off */
+#define BCME_NOTBANDLOCKED             -10     /* Not  band locked */
+#define BCME_NOCLK                     -11     /* No Clock */
+#define BCME_BADRATESET                        -12     /* BAD Rate valueset */
+#define BCME_BADBAND                   -13     /* BAD Band */
+#define BCME_BUFTOOSHORT               -14     /* Buffer too short */
+#define BCME_BUFTOOLONG                        -15     /* Buffer too long */
+#define BCME_BUSY                      -16     /* Busy */
+#define BCME_NOTASSOCIATED             -17     /* Not Associated */
+#define BCME_BADSSIDLEN                        -18     /* Bad SSID len */
+#define BCME_OUTOFRANGECHAN            -19     /* Out of Range Channel */
+#define BCME_BADCHAN                   -20     /* Bad Channel */
+#define BCME_BADADDR                   -21     /* Bad Address */
+#define BCME_NORESOURCE                        -22     /* Not Enough Resources */
+#define BCME_UNSUPPORTED               -23     /* Unsupported */
+#define BCME_BADLEN                    -24     /* Bad length */
+#define BCME_NOTREADY                  -25     /* Not Ready */
+#define BCME_EPERM                     -26     /* Not Permitted */
+#define BCME_NOMEM                     -27     /* No Memory */
+#define BCME_ASSOCIATED                        -28     /* Associated */
+#define BCME_RANGE                     -29     /* Not In Range */
+#define BCME_NOTFOUND                  -30     /* Not Found */
+#define BCME_WME_NOT_ENABLED           -31     /* WME Not Enabled */
+#define BCME_TSPEC_NOTFOUND            -32     /* TSPEC Not Found */
+#define BCME_ACM_NOTSUPPORTED          -33     /* ACM Not Supported */
+#define BCME_NOT_WME_ASSOCIATION       -34     /* Not WME Association */
+#define BCME_SDIO_ERROR                        -35     /* SDIO Bus Error */
+#define BCME_DONGLE_DOWN               -36     /* Dongle Not Accessible */
+#define BCME_LAST                      BCME_DONGLE_DOWN
+
+/* These are collection of BCME Error strings */
+#define BCMERRSTRINGTABLE {            \
+       "OK",                           \
+       "Undefined error",              \
+       "Bad Argument",                 \
+       "Bad Option",                   \
+       "Not up",                       \
+       "Not down",                     \
+       "Not AP",                       \
+       "Not STA",                      \
+       "Bad Key Index",                \
+       "Radio Off",                    \
+       "Not band locked",              \
+       "No clock",                     \
+       "Bad Rate valueset",            \
+       "Bad Band",                     \
+       "Buffer too short",             \
+       "Buffer too long",              \
+       "Busy",                         \
+       "Not Associated",               \
+       "Bad SSID len",                 \
+       "Out of Range Channel",         \
+       "Bad Channel",                  \
+       "Bad Address",                  \
+       "Not Enough Resources",         \
+       "Unsupported",                  \
+       "Bad length",                   \
+       "Not Ready",                    \
+       "Not Permitted",                \
+       "No Memory",                    \
+       "Associated",                   \
+       "Not In Range",                 \
+       "Not Found",                    \
+       "WME Not Enabled",              \
+       "TSPEC Not Found",              \
+       "ACM Not Supported",            \
+       "Not WME Association",          \
+       "SDIO Bus Error",               \
+       "Dongle Not Accessible"         \
+}
+
+#ifndef ABS
+#define        ABS(a)                  (((a) < 0)?-(a):(a))
+#endif /* ABS */
+
 #ifndef MIN
-#define        MIN(a, b)               (((a)<(b))?(a):(b))
-#endif
+#define        MIN(a, b)               (((a) < (b))?(a):(b))
+#endif /* MIN */
 
 #ifndef MAX
-#define        MAX(a, b)               (((a)>(b))?(a):(b))
-#endif
+#define        MAX(a, b)               (((a) > (b))?(a):(b))
+#endif /* MAX */
 
 #define CEIL(x, y)             (((x) + ((y)-1)) / (y))
-#define        ROUNDUP(x, y)           ((((ulong)(x)+((y)-1))/(y))*(y))
-#define        ISALIGNED(a, x)         (((uint)(a) & ((x)-1)) == 0)
-#define        ISPOWEROF2(x)           ((((x)-1)&(x))==0)
-#define        OFFSETOF(type, member)  ((uint) &((type *)0)->member)
+#define        ROUNDUP(x, y)           ((((x)+((y)-1))/(y))*(y))
+#define        ISALIGNED(a, x)         (((a) & ((x)-1)) == 0)
+#define        ISPOWEROF2(x)           ((((x)-1)&(x)) == 0)
+#define VALID_MASK(mask)       !((mask) & ((mask) + 1))
+#define        OFFSETOF(type, member)  ((uint)(uintptr)&((type *)0)->member)
 #define ARRAYSIZE(a)           (sizeof(a)/sizeof(a[0]))
 
 /* bit map related macros */
 #ifndef setbit
+#ifndef NBBY               /* the BSD family defines NBBY */
 #define        NBBY    8       /* 8 bits per byte */
-#define        setbit(a,i)     ((a)[(i)/NBBY] |= 1<<((i)%NBBY))
-#define        clrbit(a,i)     ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
-#define        isset(a,i)      ((a)[(i)/NBBY] & (1<<((i)%NBBY)))
-#define        isclr(a,i)      (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
-#endif
-
-#define        NBITS(type)     (sizeof (type) * 8)
-
-#define _BCM_U 0x01    /* upper */
-#define _BCM_L 0x02    /* lower */
-#define _BCM_D 0x04    /* digit */
-#define _BCM_C 0x08    /* cntrl */
-#define _BCM_P 0x10    /* punct */
-#define _BCM_S 0x20    /* white space (space/lf/tab) */
-#define _BCM_X 0x40    /* hex digit */
-#define _BCM_SP        0x80    /* hard space (0x20) */
-
-extern unsigned char bcm_ctype[];
-#define bcm_ismask(x) (bcm_ctype[(int)(unsigned char)(x)])
-
-#define bcm_isalnum(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0)
-#define bcm_isalpha(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0)
-#define bcm_iscntrl(c) ((bcm_ismask(c)&(_BCM_C)) != 0)
-#define bcm_isdigit(c) ((bcm_ismask(c)&(_BCM_D)) != 0)
-#define bcm_isgraph(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0)
-#define bcm_islower(c) ((bcm_ismask(c)&(_BCM_L)) != 0)
-#define bcm_isprint(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0)
-#define bcm_ispunct(c) ((bcm_ismask(c)&(_BCM_P)) != 0)
-#define bcm_isspace(c) ((bcm_ismask(c)&(_BCM_S)) != 0)
-#define bcm_isupper(c) ((bcm_ismask(c)&(_BCM_U)) != 0)
-#define bcm_isxdigit(c)        ((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0)
+#endif /* #ifndef NBBY */
+#define        setbit(a, i)    (((uint8 *)a)[(i)/NBBY] |= 1<<((i)%NBBY))
+#define        clrbit(a, i)    (((uint8 *)a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
+#define        isset(a, i)     (((uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY)))
+#define        isclr(a, i)     ((((uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
+#endif /* setbit */
 
-/*
- * Spin at most 'us' microseconds while 'exp' is true.
- * Caller should explicitly test 'exp' when this completes
- * and take appropriate error action if 'exp' is still true.
- */
-#define SPINWAIT(exp, us) { \
-       uint countdown = (us) + 9; \
-       while ((exp) && (countdown >= 10)) {\
-               OSL_DELAY(10); \
-               countdown -= 10; \
-       } \
-}
+#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)
 
-/* generic osl packet queue */
-struct pktq {
-       void *head;     /* first packet to dequeue */
-       void *tail;     /* last packet to dequeue */
-       uint len;       /* number of queued packets */
-       uint maxlen;    /* maximum number of queued packets */
-       bool priority;  /* enqueue by packet priority */
-};
-#define DEFAULT_QLEN   128
-
-#define        pktq_len(q)     ((q)->len)
-#define        pktq_avail(q)   ((q)->maxlen - (q)->len)
-#define        pktq_head(q)    ((q)->head)
-#define        pktq_full(q)    ((q)->len >= (q)->maxlen)
+/* 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 */
@@ -100,6 +174,12 @@ struct pktq {
 #define CRC32_INIT_VALUE 0xffffffff    /* Initial CRC32 checksum value */
 #define CRC32_GOOD_VALUE 0xdebb20e3    /* Good final CRC32 checksum value */
 
+/* bcm_format_flags() bit description structure */
+typedef struct bcm_bit_desc {
+       uint32  bit;
+       char*   name;
+} bcm_bit_desc_t;
+
 /* tag_ID/length/value_buffer tuple */
 typedef struct bcm_tlv {
        uint8   id;
@@ -108,50 +188,71 @@ typedef struct bcm_tlv {
 } bcm_tlv_t;
 
 /* Check that bcm_tlv_t fits into the given buflen */
-#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (buflen) >= 2 + (elt)->len)
+#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len))
 
 /* buffer length for ethernet address from bcm_ether_ntoa() */
-#define ETHER_ADDR_STR_LEN     18
+#define ETHER_ADDR_STR_LEN     18      /* 18-bytes of Ethernet address buffer length */
 
-/*
-* load 32-bit value from unaligned byte array
-*/
+/* unaligned load and store macros */
 #ifdef IL_BIGENDIAN
-#define load32_ua(a)   ((((uint8 *)(a))[0] << 24) + (((uint8 *)(a))[1] << 16) + \
-                       (((uint8 *)(a))[2] << 8) + ((uint8 *)(a))[3])
+static INLINE uint32
+load32_ua(uint8 *a)
+{
+       return ((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]);
+}
+
+static INLINE void
+store32_ua(uint8 *a, uint32 v)
+{
+       a[0] = (v >> 24) & 0xff;
+       a[1] = (v >> 16) & 0xff;
+       a[2] = (v >> 8) & 0xff;
+       a[3] = v & 0xff;
+}
+
+static INLINE uint16
+load16_ua(uint8 *a)
+{
+       return ((a[0] << 8) | a[1]);
+}
+
+static INLINE void
+store16_ua(uint8 *a, uint16 v)
+{
+       a[0] = (v >> 8) & 0xff;
+       a[1] = v & 0xff;
+}
+
 #else
-#define load32_ua(a)   ((((uint8 *)(a))[3] << 24) + (((uint8 *)(a))[2] << 16) + \
-                       (((uint8 *)(a))[1] << 8) + ((uint8 *)(a))[0])
-#endif
-
-/* externs */
-extern uint bcm_atoi(char *s);
-extern uchar bcm_toupper(uchar c);
-extern ulong bcm_strtoul(char *cp, char **endp, uint base);
-extern void deadbeef(char *p, uint len);
-extern void prhex(char *msg, uchar *buf, uint len);
-extern void prpkt(char *msg, void *drv, void *p0);
-extern uint pktcopy(void *drv, void *p, uint offset, int len, uchar *buf);
-extern uint pkttotlen(void *drv, void *);
-extern uchar *bcm_ether_ntoa(char *ea, char *buf);
-extern int bcm_ether_atoe(char *p, char *ea);
-extern void bcm_mdelay(uint ms);
-extern char *getvar(char *vars, char *name);
-extern int getintvar(char *vars, char *name);
-extern char *bcmstrstr(char *haystack, char *needle);
-
-extern uint8 crc8(uint8 *p, uint nbytes, uint8 crc);
-extern uint16 crc16(uint8 *p, uint nbytes, uint16 crc);
-extern uint32 crc32(uint8 *p, uint nbytes, uint32 crc);
-extern bcm_tlv_t *bcm_next_tlv(bcm_tlv_t *elt, int *buflen);
-extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key);
-extern bcm_tlv_t *bcm_parse_ordered_tlvs(void *buf, int buflen, uint key);
-extern void pktq_init(struct pktq *q, uint maxlen, bool priority);
-extern bool pktenq(struct pktq *q, void *p, bool lifo);
-extern void *pktdeq(struct pktq *q);
-
-#define        bcmlog(fmt, a1, a2)
-#define        bcmdumplog(buf, size)   *buf = '\0'
-#define        bcmdumplogent(buf, idx) -1
+
+static INLINE uint32
+load32_ua(uint8 *a)
+{
+       return ((a[3] << 24) | (a[2] << 16) | (a[1] << 8) | a[0]);
+}
+
+static INLINE void
+store32_ua(uint8 *a, uint32 v)
+{
+       a[3] = (v >> 24) & 0xff;
+       a[2] = (v >> 16) & 0xff;
+       a[1] = (v >> 8) & 0xff;
+       a[0] = v & 0xff;
+}
+
+static INLINE uint16
+load16_ua(uint8 *a)
+{
+       return ((a[1] << 8) | a[0]);
+}
+
+static INLINE void
+store16_ua(uint8 *a, uint16 v)
+{
+       a[1] = (v >> 8) & 0xff;
+       a[0] = v & 0xff;
+}
+
+#endif /* IL_BIGENDIAN */
 
 #endif /* _bcmutils_h_ */
diff --git a/package/wlcompat/src/include/cy_conf.h b/package/wlcompat/src/include/cy_conf.h
deleted file mode 100644 (file)
index dbe387b..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-
-#define        DNSMASQ_SUPPORT 1
-#define        CONFIG_DNSMASQ  y
-#define        UDHCPD_SUPPORT  1
-#define        CONFIG_UDHCPD   y
-#define        UDHCPC_SUPPORT  1
-#define        CONFIG_UDHCPC   y
-#define        PPPOE_SUPPORT   1
-#define        CONFIG_PPPOE    y
-#define        PPTP_SUPPORT    1
-#define        CONFIG_PPTP     y
-#define        L2TP_SUPPORT    1
-#define        CONFIG_L2TP     y
-#define        PPPD_SUPPORT    1
-#define        CONFIG_PPPD     y
-#define        ZEBRA_SUPPORT   1
-#define        CONFIG_ZEBRA    y
-#define        TFTPD_SUPPORT   1
-#define        CONFIG_TFTPD    y
-#define        DDNS_SUPPORT    1
-#define        CONFIG_DDNS     y
-#define        CRON_SUPPORT    1
-#define        CONFIG_CRON     y
-#define        HTTPD_SUPPORT   1
-#define        CONFIG_HTTPD    y
-#define        GET_POST_SUPPORT        1
-#define        CONFIG_GET_POST y
-
-#if 1
-#define        HEARTBEAT_SUPPORT       1
-#define        CONFIG_HEARTBEAT        y
-#define        MULTICAST_SUPPORT       1
-#define        CONFIG_MULTICAST        y
-#define        SETUP_WIZARD_SUPPORT    1
-#define        CONFIG_SETUP_WIZARD     y
-#define        PARENTAL_CONTROL_SUPPORT        1
-#define        CONFIG_PARENTAL_CONTROL y
-#define        HTTPS_SUPPORT   1
-#define        CONFIG_HTTPS    y
-#define        EOU_SUPPORT     1
-#define        CONFIG_EOU      y
-#define        EZC_SUPPORT     1
-#define        CONFIG_EZC      y
-#define        WRITE_MAC_SUPPORT       1
-#define        CONFIG_WRITE_MAC        y
-#define        DIAG_SUPPORT    1
-#define        CONFIG_DIAG     y
-#endif
-
-#define        SPEED_BOOSTER_SUPPORT   1
-#define        CONFIG_SPEED_BOOSTER    y
-#define        XBOX_SUPPORT    1
-#define        CONFIG_XBOX     y
-
-#if 0
-#define        MPPPOE_SUPPORT  1
-#define        CONFIG_MPPPOE   y
-#define        UNNUMBERIP_SUPPORT      1
-#define        CONFIG_UNNUMBERIP       y
-#endif
-
-#define        WL_STA_SUPPORT  1
-#define        CONFIG_WL_STA   y
-#define        BACKUP_RESTORE_SUPPORT  1
-#define        CONFIG_BACKUP_RESTORE   y
-#define        PORT_TRIGGER_SUPPORT    1
-#define        CONFIG_PORT_TRIGGER     y
-#define        HW_QOS_SUPPORT  1
-#define        CONFIG_HW_QOS   y
diff --git a/package/wlcompat/src/include/epivers.h b/package/wlcompat/src/include/epivers.h
deleted file mode 100644 (file)
index e174fb5..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 2004, Broadcom Corporation
- * All Rights Reserved.
- * 
- * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
- * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
- * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
- *
- * $Id$
- *
-*/
-
-#ifndef _epivers_h_
-#define _epivers_h_
-
-#ifdef linux
-#include <linux/config.h>
-#endif
-
-/* Vendor Name, ASCII, 32 chars max */
-#ifdef COMPANYNAME
-#define        HPNA_VENDOR             COMPANYNAME
-#else
-#define        HPNA_VENDOR             "Broadcom Corporation"
-#endif
-
-/* Driver Date, ASCII, 32 chars max */
-#define HPNA_DRV_BUILD_DATE    __DATE__
-
-/* Hardware Manufacture Date, ASCII, 32 chars max */
-#define HPNA_HW_MFG_DATE       "Not Specified"
-
-/* See documentation for Device Type values, 32 values max */
-#ifndef        HPNA_DEV_TYPE
-
-#if    defined(CONFIG_BRCM_VJ)
-#define HPNA_DEV_TYPE          { CDCF_V0_DEVICE_DISPLAY }
-
-#elif  defined(CONFIG_BCRM_93725)
-#define HPNA_DEV_TYPE          { CDCF_V0_DEVICE_CM_BRIDGE, CDCF_V0_DEVICE_DISPLAY }
-
-#else
-#define HPNA_DEV_TYPE          { CDCF_V0_DEVICE_PCINIC }
-
-#endif
-
-#endif /* !HPNA_DEV_TYPE */
-
-
-#define        EPI_MAJOR_VERSION       3
-
-#define        EPI_MINOR_VERSION       60
-
-#define        EPI_RC_NUMBER           13
-
-#define        EPI_INCREMENTAL_NUMBER  0
-
-#define        EPI_BUILD_NUMBER        0
-
-#define        EPI_VERSION             3,60,13,0
-
-#define        EPI_VERSION_NUM         0x033c0d00
-
-/* Driver Version String, ASCII, 32 chars max */
-#define        EPI_VERSION_STR         "3.60.13.0"
-#define        EPI_ROUTER_VERSION_STR  "3.61.13.0"
-
-#endif /* _epivers_h_ */
index ea57850ce56d5965f06397513ef26d7a85be9d00..0557722e286d53a2768172639b60db64279555fb 100644 (file)
@@ -1,13 +1,13 @@
 /*
- * Copyright 2004, Broadcom Corporation      
- * All Rights Reserved.      
- *       
- * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY      
- * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM      
- * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS      
- * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.      
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
  *
- * Fundamental types and constants relating to 802.11 
+ * Fundamental types and constants relating to 802.11
  *
  * $Id$
  */
 #include <proto/ethernet.h>
 #endif
 
-/* enable structure packing */
-#if !defined(__GNUC__)
-#pragma pack(1)
-#endif
+#include <proto/wpa.h>
 
-/* some platforms require stronger medicine */
+/* enable structure packing */
 #if defined(__GNUC__)
 #define        PACKED  __attribute__((packed))
 #else
+#pragma pack(1)
 #define        PACKED
 #endif
 
-
 #define DOT11_TU_TO_US                 1024    /* 802.11 Time Unit is 1024 microseconds */
 
 /* Generic 802.11 frame constants */
-#define DOT11_A3_HDR_LEN               24
-#define DOT11_A4_HDR_LEN               30
-#define DOT11_MAC_HDR_LEN              DOT11_A3_HDR_LEN
-#define DOT11_FCS_LEN                  4
-#define DOT11_ICV_LEN                  4
-#define DOT11_ICV_AES_LEN              8
-#define DOT11_QOS_LEN                  2
-
-#define DOT11_KEY_INDEX_SHIFT          6
-#define DOT11_IV_LEN                   4
-#define DOT11_IV_TKIP_LEN              8
-#define DOT11_IV_AES_OCB_LEN           4
-#define DOT11_IV_AES_CCM_LEN           8
+#define DOT11_A3_HDR_LEN               24      /* d11 header length with A3 */
+#define DOT11_A4_HDR_LEN               30      /* d11 header length with A4 */
+#define DOT11_MAC_HDR_LEN              DOT11_A3_HDR_LEN        /* MAC header length */
+#define DOT11_FCS_LEN                  4       /* d11 FCS length */
+#define DOT11_ICV_LEN                  4       /* d11 ICV length */
+#define DOT11_ICV_AES_LEN              8       /* d11 ICV/AES length */
+#define DOT11_QOS_LEN                  2       /* d11 QoS length */
+#define DOT11_HTC_LEN                  4       /* d11 HT Control field length */
+
+#define DOT11_KEY_INDEX_SHIFT          6       /* d11 key index shift */
+#define DOT11_IV_LEN                   4       /* d11 IV length */
+#define DOT11_IV_TKIP_LEN              8       /* d11 IV TKIP length */
+#define DOT11_IV_AES_OCB_LEN           4       /* d11 IV/AES/OCB length */
+#define DOT11_IV_AES_CCM_LEN           8       /* d11 IV/AES/CCM length */
+#define DOT11_IV_MAX_LEN               8       /* maximum iv len for any encryption */
 
 /* Includes MIC */
-#define DOT11_MAX_MPDU_BODY_LEN                2304
+#define DOT11_MAX_MPDU_BODY_LEN                2304    /* max MPDU body length */
 /* A4 header + QoS + CCMP + PDU + ICV + FCS = 2352 */
 #define DOT11_MAX_MPDU_LEN             (DOT11_A4_HDR_LEN + \
                                         DOT11_QOS_LEN + \
                                         DOT11_IV_AES_CCM_LEN + \
                                         DOT11_MAX_MPDU_BODY_LEN + \
                                         DOT11_ICV_LEN + \
-                                        DOT11_FCS_LEN)
+                                        DOT11_FCS_LEN) /* d11 max MPDU length */
 
-#define DOT11_MAX_SSID_LEN             32
+#define DOT11_MAX_SSID_LEN             32      /* d11 max ssid length */
 
 /* dot11RTSThreshold */
-#define DOT11_DEFAULT_RTS_LEN          2347
-#define DOT11_MAX_RTS_LEN              2347
+#define DOT11_DEFAULT_RTS_LEN          2347    /* d11 default RTS length */
+#define DOT11_MAX_RTS_LEN              2347    /* d11 max RTS length */
 
 /* dot11FragmentationThreshold */
-#define DOT11_MIN_FRAG_LEN             256
-#define DOT11_MAX_FRAG_LEN             2346    /* Max frag is also limited by aMPDUMaxLength of the attached PHY */
-#define DOT11_DEFAULT_FRAG_LEN         2346
+#define DOT11_MIN_FRAG_LEN             256     /* d11 min fragmentation length */
+#define DOT11_MAX_FRAG_LEN             2346    /* Max frag is also limited by aMPDUMaxLength
+                                               * of the attached PHY
+                                               */
+#define DOT11_DEFAULT_FRAG_LEN         2346    /* d11 default fragmentation length */
 
 /* dot11BeaconPeriod */
-#define DOT11_MIN_BEACON_PERIOD                1
-#define DOT11_MAX_BEACON_PERIOD                0xFFFF
+#define DOT11_MIN_BEACON_PERIOD                1       /* d11 min beacon period */
+#define DOT11_MAX_BEACON_PERIOD                0xFFFF  /* d11 max beacon period */
 
 /* dot11DTIMPeriod */
-#define DOT11_MIN_DTIM_PERIOD          1
-#define DOT11_MAX_DTIM_PERIOD          0xFF
+#define DOT11_MIN_DTIM_PERIOD          1       /* d11 min DTIM period */
+#define DOT11_MAX_DTIM_PERIOD          0xFF    /* d11 max DTIM period */
 
 /* 802.2 LLC/SNAP header used by 802.11 per 802.1H */
-#define DOT11_LLC_SNAP_HDR_LEN 8
-#define DOT11_OUI_LEN                  3
+#define DOT11_LLC_SNAP_HDR_LEN         8       /* d11 LLC/SNAP header length */
+#define DOT11_OUI_LEN                  3       /* d11 OUI length */
 struct dot11_llc_snap_header {
        uint8   dsap;                           /* always 0xAA */
        uint8   ssap;                           /* always 0xAA */
        uint8   ctl;                            /* always 0x03 */
        uint8   oui[DOT11_OUI_LEN];             /* RFC1042: 0x00 0x00 0x00
-                                                  Bridge-Tunnel: 0x00 0x00 0xF8 */
+                                                * Bridge-Tunnel: 0x00 0x00 0xF8
+                                                */
        uint16  type;                           /* ethertype */
 } PACKED;
 
 /* RFC1042 header used by 802.11 per 802.1H */
-#define RFC1042_HDR_LEN                        (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN)
+#define RFC1042_HDR_LEN        (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN)        /* RCF1042 header length */
 
 /* Generic 802.11 MAC header */
 /*
@@ -121,21 +123,21 @@ struct dot11_rts_frame {
        struct ether_addr       ra;             /* receiver address */
        struct ether_addr       ta;             /* transmitter address */
 } PACKED;
-#define        DOT11_RTS_LEN           16
+#define        DOT11_RTS_LEN           16              /* d11 RTS frame length */
 
 struct dot11_cts_frame {
        uint16                  fc;             /* frame control */
        uint16                  durid;          /* duration/ID */
        struct ether_addr       ra;             /* receiver address */
 } PACKED;
-#define        DOT11_CTS_LEN           10
+#define        DOT11_CTS_LEN           10              /* d11 CTS frame length */
 
 struct dot11_ack_frame {
        uint16                  fc;             /* frame control */
        uint16                  durid;          /* duration/ID */
        struct ether_addr       ra;             /* receiver address */
 } PACKED;
-#define        DOT11_ACK_LEN           10
+#define        DOT11_ACK_LEN           10              /* d11 ACK frame length */
 
 struct dot11_ps_poll_frame {
        uint16                  fc;             /* frame control */
@@ -143,7 +145,7 @@ struct dot11_ps_poll_frame {
        struct ether_addr       bssid;          /* receiver address, STA in AP */
        struct ether_addr       ta;             /* transmitter address */
 } PACKED;
-#define        DOT11_PS_POLL_LEN       16
+#define        DOT11_PS_POLL_LEN       16              /* d11 PS poll frame length */
 
 struct dot11_cf_end_frame {
        uint16                  fc;             /* frame control */
@@ -151,7 +153,44 @@ struct dot11_cf_end_frame {
        struct ether_addr       ra;             /* receiver address */
        struct ether_addr       bssid;          /* transmitter address, STA in AP */
 } PACKED;
-#define        DOT11_CS_END_LEN        16
+#define        DOT11_CS_END_LEN        16              /* d11 CF-END frame length */
+
+/* BA/BAR Control parameters */
+#define DOT11_BA_CTL_POLICY_NORMAL     0x0000  /* normal ack */
+#define DOT11_BA_CTL_POLICY_NOACK      0x0001  /* no ack */
+#define DOT11_BA_CTL_POLICY_MASK       0x0001  /* ack policy mask */
+
+#define DOT11_BA_CTL_MTID              0x0002  /* multi tid BA */
+#define DOT11_BA_CTL_COMPRESSED                0x0004  /* compressed bitmap */
+
+#define DOT11_BA_CTL_NUMMSDU_MASK      0x0FC0  /* num msdu in bitmap mask */
+#define DOT11_BA_CTL_NUMMSDU_SHIFT     6       /* num msdu in bitmap shift */
+
+#define DOT11_BA_CTL_TID_MASK          0xF000  /* tid mask */
+#define DOT11_BA_CTL_TID_SHIFT         12      /* tid shift */
+
+struct dot11_ba_req_frame {
+       uint16                  fc;             /* frame control */
+       uint16                  durid;          /* duration/ID */
+       struct ether_addr       ra;             /* receiver address */
+       struct ether_addr       ta;             /* transmitter address */
+       uint16                  bar_control;    /* BAR Control */
+       uint16                  seqnum;         /* Starting Sequence control */
+} PACKED;
+#define DOT11_BA_REQ_LEN       20              /* BAR frame length */
+
+#define DOT11_BA_BITMAP_LEN    128             /* bitmap length */
+#define DOT11_BA_CMP_BITMAP_LEN        8               /* compressed bitmap length */
+struct dot11_ba_frame {
+       uint16                  fc;             /* frame control */
+       uint16                  durid;          /* duration/ID */
+       struct ether_addr       ra;             /* receiver address */
+       struct ether_addr       ta;             /* transmitter address */
+       uint16                  ba_control;     /* BA Control */
+       uint16                  seqnum;         /* Starting Sequence control */
+       uint8                   bitmap[DOT11_BA_BITMAP_LEN];    /* Block Ack Bitmap */
+} PACKED;
+#define DOT11_BA_LEN           20              /* BA frame length (without bitmap) */
 
 /* Management frame header */
 struct dot11_management_header {
@@ -162,7 +201,7 @@ struct dot11_management_header {
        struct ether_addr       bssid;          /* BSS ID */
        uint16                  seq;            /* sequence control */
 } PACKED;
-#define        DOT11_MGMT_HDR_LEN      24
+#define        DOT11_MGMT_HDR_LEN      24              /* d11 management header length */
 
 /* Management frame payloads */
 
@@ -171,19 +210,29 @@ struct dot11_bcn_prb {
        uint16                  beacon_interval;
        uint16                  capability;
 } PACKED;
-#define        DOT11_BCN_PRB_LEN       12
+#define        DOT11_BCN_PRB_LEN       12              /* d11 beacon probe frame length */
 
 struct dot11_auth {
        uint16                  alg;            /* algorithm */
        uint16                  seq;            /* sequence control */
        uint16                  status;         /* status code */
 } PACKED;
-#define DOT11_AUTH_FIXED_LEN   6               /* length of auth frame without challenge info elt */
+#define DOT11_AUTH_FIXED_LEN   6               /* length of auth frame without challenge info
+                                                * elt
+                                                */
 
 struct dot11_assoc_req {
        uint16                  capability;     /* capability information */
        uint16                  listen;         /* listen interval */
 } PACKED;
+#define DOT11_ASSOC_REQ_FIXED_LEN      4       /* length of assoc frame without info elts */
+
+struct dot11_reassoc_req {
+       uint16                  capability;     /* capability information */
+       uint16                  listen;         /* listen interval */
+       struct ether_addr       ap;             /* Current AP address */
+} PACKED;
+#define DOT11_REASSOC_REQ_FIXED_LEN    10      /* length of assoc frame without info elts */
 
 struct dot11_assoc_resp {
        uint16                  capability;     /* capability information */
@@ -197,11 +246,28 @@ struct dot11_action_measure {
        uint8   token;
        uint8   data[1];
 } PACKED;
-#define DOT11_ACTION_MEASURE_LEN       3
+#define DOT11_ACTION_MEASURE_LEN       3       /* d11 action measurement header length */
 
-/**************
-  802.11h related definitions.
-**************/
+struct dot11_action_switch_channel {
+       uint8   category;
+       uint8   action;
+       uint8   data[5]; /* for switch IE */
+} PACKED;
+
+struct dot11_action_ht_ch_width {
+       uint8   category;
+       uint8   action;
+       uint8   ch_width;
+} PACKED;
+
+struct dot11_action_ht_mimops {
+       uint8   category;
+       uint8   action;
+       uint8   enable;
+       uint8   psmode;
+} PACKED;
+
+/* ************* 802.11h related definitions. ************* */
 typedef struct {
        uint8 id;
        uint8 len;
@@ -219,7 +285,7 @@ typedef struct {
        uint8 tx_pwr;
        uint8 margin;
 } dot11_tpc_rep_t;
-#define DOT11_MNG_IE_TPC_REPORT_LEN    2       /* length of IE data, not including 2 byte header */
+#define DOT11_MNG_IE_TPC_REPORT_LEN    2       /* length of IE data, not including 2 byte header */
 
 typedef struct {
        uint8 id;
@@ -228,6 +294,11 @@ typedef struct {
        uint8 num_channels;
 } dot11_supp_channels_t;
 
+/* channel switch announcement (CSA) mode type - 802.11h-2003 $7.3.2.20 */
+#define DOT11_CSA_MODE_ADVISORY                0       /* no DOT11_CSA_MODE_NO_TX restriction imposed */
+#define DOT11_CSA_MODE_NO_TX           1       /* no transmission upon receiving CSA frame. */
+
+/* CSA IE data structure */
 struct dot11_channel_switch {
        uint8 id;
        uint8 len;
@@ -237,28 +308,30 @@ struct dot11_channel_switch {
 }  PACKED;
 typedef struct dot11_channel_switch dot11_channel_switch_t;
 
+#define DOT11_SWITCH_IE_LEN    3       /* length of IE data, not including 2 byte header */
+
 /* 802.11h Measurement Request/Report IEs */
 /* Measurement Type field */
-#define DOT11_MEASURE_TYPE_BASIC       0
-#define DOT11_MEASURE_TYPE_CCA                 1
-#define DOT11_MEASURE_TYPE_RPI         2
+#define DOT11_MEASURE_TYPE_BASIC       0       /* d11 measurement basic type */
+#define DOT11_MEASURE_TYPE_CCA                 1       /* d11 measurement CCA type */
+#define DOT11_MEASURE_TYPE_RPI         2       /* d11 measurement PRI type */
 
 /* Measurement Mode field */
 
 /* Measurement Request Modes */
-#define DOT11_MEASURE_MODE_ENABLE      (1<<1)
-#define DOT11_MEASURE_MODE_REQUEST     (1<<2)
-#define DOT11_MEASURE_MODE_REPORT      (1<<3)
+#define DOT11_MEASURE_MODE_ENABLE      (1<<1)  /* d11 measurement enable */
+#define DOT11_MEASURE_MODE_REQUEST     (1<<2)  /* d11 measurement request */
+#define DOT11_MEASURE_MODE_REPORT      (1<<3)  /* d11 measurement report */
 /* Measurement Report Modes */
-#define DOT11_MEASURE_MODE_LATE        (1<<0)
-#define DOT11_MEASURE_MODE_INCAPABLE   (1<<1)
-#define DOT11_MEASURE_MODE_REFUSED     (1<<2)
+#define DOT11_MEASURE_MODE_LATE        (1<<0)  /* d11 measurement late */
+#define DOT11_MEASURE_MODE_INCAPABLE   (1<<1)  /* d11 measurement incapable */
+#define DOT11_MEASURE_MODE_REFUSED     (1<<2)  /* d11 measurement refuse */
 /* Basic Measurement Map bits */
-#define DOT11_MEASURE_BASIC_MAP_BSS    ((uint8)(1<<0))
-#define DOT11_MEASURE_BASIC_MAP_OFDM   ((uint8)(1<<1))
-#define DOT11_MEASURE_BASIC_MAP_UKNOWN ((uint8)(1<<2))
-#define DOT11_MEASURE_BASIC_MAP_RADAR  ((uint8)(1<<3))
-#define DOT11_MEASURE_BASIC_MAP_UNMEAS ((uint8)(1<<4))
+#define DOT11_MEASURE_BASIC_MAP_BSS    ((uint8)(1<<0)) /* d11 measurement basic map BSS */
+#define DOT11_MEASURE_BASIC_MAP_OFDM   ((uint8)(1<<1)) /* d11 measurement map OFDM */
+#define DOT11_MEASURE_BASIC_MAP_UKNOWN ((uint8)(1<<2)) /* d11 measurement map unknown */
+#define DOT11_MEASURE_BASIC_MAP_RADAR  ((uint8)(1<<3)) /* d11 measurement map radar */
+#define DOT11_MEASURE_BASIC_MAP_UNMEAS ((uint8)(1<<4)) /* d11 measurement map unmeasuremnt */
 
 typedef struct {
        uint8 id;
@@ -270,9 +343,9 @@ typedef struct {
        uint8 start_time[8];
        uint16 duration;
 } dot11_meas_req_t;
-#define DOT11_MNG_IE_MREQ_LEN 14
+#define DOT11_MNG_IE_MREQ_LEN 14       /* d11 measurement request IE length */
 /* length of Measure Request IE data not including variable len */
-#define DOT11_MNG_IE_MREQ_FIXED_LEN 3
+#define DOT11_MNG_IE_MREQ_FIXED_LEN 3  /* d11 measurement request IE fixed length */
 
 struct dot11_meas_rep {
        uint8 id;
@@ -280,7 +353,7 @@ struct dot11_meas_rep {
        uint8 token;
        uint8 mode;
        uint8 type;
-       union 
+       union
        {
                struct {
                        uint8 channel;
@@ -294,7 +367,7 @@ struct dot11_meas_rep {
 typedef struct dot11_meas_rep dot11_meas_rep_t;
 
 /* length of Measure Report IE data not including variable len */
-#define DOT11_MNG_IE_MREP_FIXED_LEN    3
+#define DOT11_MNG_IE_MREP_FIXED_LEN    3       /* d11 measurement response IE fixed length */
 
 struct dot11_meas_rep_basic {
        uint8 channel;
@@ -303,14 +376,14 @@ struct dot11_meas_rep_basic {
        uint8 map;
 } PACKED;
 typedef struct dot11_meas_rep_basic dot11_meas_rep_basic_t;
-#define DOT11_MEASURE_BASIC_REP_LEN    12
+#define DOT11_MEASURE_BASIC_REP_LEN    12      /* d11 measurement basic report length */
 
 struct dot11_quiet {
        uint8 id;
        uint8 len;
        uint8 count;    /* TBTTs until beacon interval in quiet starts */
        uint8 period;   /* Beacon intervals between periodic quiet periods ? */
-       uint16 duration;/* Length of quiet period, in TU's */
+       uint16 duration;        /* Length of quiet period, in TU's */
        uint16 offset;  /* TU's offset from TBTT in Count field */
 } PACKED;
 typedef struct dot11_quiet dot11_quiet_t;
@@ -329,9 +402,9 @@ typedef struct {
 } dot11_ibss_dfs_t;
 
 /* WME Elements */
-#define WME_OUI                        "\x00\x50\xf2"
-#define WME_VER                        1
-#define WME_TYPE               2
+#define WME_OUI                        "\x00\x50\xf2"  /* WME OUI */
+#define WME_VER                        1       /* WME version */
+#define WME_TYPE               2       /* WME type */
 #define WME_SUBTYPE_IE         0       /* Information Element */
 #define WME_SUBTYPE_PARAM_IE   1       /* Parameter Element */
 #define WME_SUBTYPE_TSPEC      2       /* Traffic Specification */
@@ -341,7 +414,13 @@ typedef struct {
 #define AC_BK                  1       /* Background */
 #define AC_VI                  2       /* Video */
 #define AC_VO                  3       /* Voice */
-#define AC_MAX                 4
+#define AC_COUNT               4       /* number of ACs */
+
+typedef uint8 ac_bitmap_t;     /* AC bitmap of (1 << AC_xx) */
+
+#define AC_BITMAP_NONE         0x0     /* No ACs */
+#define AC_BITMAP_ALL          0xf     /* All ACs */
+#define AC_BITMAP_TST(ab, ac)  (((ab) & (1 << (ac))) != 0)
 
 /* WME Information Element (IE) */
 struct wme_ie {
@@ -349,86 +428,108 @@ struct wme_ie {
        uint8 type;
        uint8 subtype;
        uint8 version;
-       uint8 acinfo;
+       uint8 qosinfo;
 } PACKED;
 typedef struct wme_ie wme_ie_t;
-#define WME_IE_LEN 7
+#define WME_IE_LEN 7   /* WME IE length */
 
-struct wme_acparam {
+struct edcf_acparam {
        uint8   ACI;
        uint8   ECW;
        uint16  TXOP;           /* stored in network order (ls octet first) */
 } PACKED;
-typedef struct wme_acparam wme_acparam_t;
+typedef struct edcf_acparam edcf_acparam_t;
 
 /* WME Parameter Element (PE) */
-struct wme_params {
+struct wme_param_ie {
        uint8 oui[3];
        uint8 type;
        uint8 subtype;
        uint8 version;
-       uint8 acinfo;
+       uint8 qosinfo;
        uint8 rsvd;
-       wme_acparam_t acparam[4];
+       edcf_acparam_t acparam[AC_COUNT];
 } PACKED;
-typedef struct wme_params wme_params_t;
-#define WME_PARAMS_IE_LEN      24
+typedef struct wme_param_ie wme_param_ie_t;
+#define WME_PARAM_IE_LEN            24          /* WME Parameter IE length */
+
+/* QoS Info field for IE as sent from AP */
+#define WME_QI_AP_APSD_MASK         0x80        /* U-APSD Supported mask */
+#define WME_QI_AP_APSD_SHIFT        7           /* U-APSD Supported shift */
+#define WME_QI_AP_COUNT_MASK        0x0f        /* Parameter set count mask */
+#define WME_QI_AP_COUNT_SHIFT       0           /* Parameter set count shift */
+
+/* QoS Info field for IE as sent from STA */
+#define WME_QI_STA_MAXSPLEN_MASK    0x60        /* Max Service Period Length mask */
+#define WME_QI_STA_MAXSPLEN_SHIFT   5           /* Max Service Period Length shift */
+#define WME_QI_STA_APSD_ALL_MASK    0xf         /* APSD all AC bits mask */
+#define WME_QI_STA_APSD_ALL_SHIFT   0           /* APSD all AC bits shift */
+#define WME_QI_STA_APSD_BE_MASK     0x8         /* APSD AC_BE mask */
+#define WME_QI_STA_APSD_BE_SHIFT    3           /* APSD AC_BE shift */
+#define WME_QI_STA_APSD_BK_MASK     0x4         /* APSD AC_BK mask */
+#define WME_QI_STA_APSD_BK_SHIFT    2           /* APSD AC_BK shift */
+#define WME_QI_STA_APSD_VI_MASK     0x2         /* APSD AC_VI mask */
+#define WME_QI_STA_APSD_VI_SHIFT    1           /* APSD AC_VI shift */
+#define WME_QI_STA_APSD_VO_MASK     0x1         /* APSD AC_VO mask */
+#define WME_QI_STA_APSD_VO_SHIFT    0           /* APSD AC_VO shift */
 
-/* acinfo */
-#define WME_COUNT_MASK         0x0f
 /* ACI */
-#define WME_AIFS_MASK  0x0f
-#define WME_ACM_MASK   0x10
-#define WME_ACI_MASK   0x60
-#define WME_ACI_SHIFT  5
+#define EDCF_AIFSN_MIN               1           /* AIFSN minimum value */
+#define EDCF_AIFSN_MAX               15          /* AIFSN maximum value */
+#define EDCF_AIFSN_MASK              0x0f        /* AIFSN mask */
+#define EDCF_ACM_MASK                0x10        /* ACM mask */
+#define EDCF_ACI_MASK                0x60        /* ACI mask */
+#define EDCF_ACI_SHIFT               5           /* ACI shift */
+
 /* ECW */
-#define WME_CWMIN_MASK 0x0f
-#define WME_CWMAX_MASK 0xf0
-#define WME_CWMAX_SHIFT        4
-
-#define WME_TXOP_UNITS 32
-
-/* WME Traffic Specification (TSPEC) element */
-#define WME_SUBTYPE_TSPEC 2
-#define WME_TSPEC_HDR_LEN              2
-#define WME_TSPEC_BODY_OFF             2
-struct wme_tspec {
-       uint8 oui[DOT11_OUI_LEN];       /* WME_OUI */
-       uint8 type;                     /* WME_TYPE */
-       uint8 subtype;                  /* WME_SUBTYPE_TSPEC */
-       uint8 version;                  /* WME_VERSION */
-       uint16 ts_info;                 /* TS Info */
-       uint16 nom_msdu_size;           /* (Nominal or fixed) MSDU Size (bytes) */
-       uint16 max_msdu_size;           /* Maximum MSDU Size (bytes) */
-       uint32 min_service_interval;    /* Minimum Service Interval (us) */
-       uint32 max_service_interval;    /* Maximum Service Interval (us) */
-       uint32 inactivity_interval;     /* Inactivity Interval (us) */
-       uint32 service_start;           /* Service Start Time (us) */
-       uint32 min_rate;                /* Minimum Data Rate (bps) */
-       uint32 mean_rate;               /* Mean Data Rate (bps) */
-       uint32 max_burst_size;          /* Maximum Burst Size (bytes) */
-       uint32 min_phy_rate;            /* Minimum PHY Rate (bps) */
-       uint32 peak_rate;               /* Peak Data Rate (bps) */
-       uint32 delay_bound;             /* Delay Bound (us) */
-       uint16 surplus_bandwidth;       /* Surplus Bandwidth Allowance Factor */
-       uint16 medium_time;             /* Medium Time (32 us/s periods) */
-} PACKED;
-typedef struct wme_tspec wme_tspec_t;
-#define WME_TSPEC_LEN 56               /* not including 2-byte header */
-
-/* ts_info */
-/* 802.1D priority is duplicated - bits 13-11 AND bits 3-1 */
-#define TS_INFO_PRIO_SHIFT_HI          11
-#define TS_INFO_PRIO_MASK_HI           (0x7 << TS_INFO_PRIO_SHIFT_HI)
-#define TS_INFO_PRIO_SHIFT_LO          1
-#define TS_INFO_PRIO_MASK_LO           (0x7 << TS_INFO_PRIO_SHIFT_LO)
-#define TS_INFO_CONTENTION_SHIFT       7
-#define TS_INFO_CONTENTION_MASK                (0x1 << TS_INFO_CONTENTION_SHIFT)
-#define TS_INFO_DIRECTION_SHIFT                5
-#define TS_INFO_DIRECTION_MASK         (0x3 << TS_INFO_DIRECTION_SHIFT)
-#define TS_INFO_UPLINK                 (0 << TS_INFO_DIRECTION_SHIFT)
-#define TS_INFO_DOWNLINK               (1 << TS_INFO_DIRECTION_SHIFT)
-#define TS_INFO_BIDIRECTIONAL          (3 << TS_INFO_DIRECTION_SHIFT)
+#define EDCF_ECW_MIN                 0           /* cwmin/cwmax exponent minimum value */
+#define EDCF_ECW_MAX                 15          /* cwmin/cwmax exponent maximum value */
+#define EDCF_ECW2CW(exp)             ((1 << (exp)) - 1)
+#define EDCF_ECWMIN_MASK             0x0f        /* cwmin exponent form mask */
+#define EDCF_ECWMAX_MASK             0xf0        /* cwmax exponent form mask */
+#define EDCF_ECWMAX_SHIFT            4           /* cwmax exponent form shift */
+
+/* TXOP */
+#define EDCF_TXOP_MIN                0           /* TXOP minimum value */
+#define EDCF_TXOP_MAX                65535       /* TXOP maximum value */
+#define EDCF_TXOP2USEC(txop)         ((txop) << 5)
+
+/* Default EDCF parameters that AP advertises for STA to use; WMM draft Table 12 */
+#define EDCF_AC_BE_ACI_STA           0x03      /* STA ACI value for best effort AC */
+#define EDCF_AC_BE_ECW_STA           0xA4      /* STA ECW value for best effort AC */
+#define EDCF_AC_BE_TXOP_STA          0x0000    /* STA TXOP value for best effort AC */
+#define EDCF_AC_BK_ACI_STA           0x27      /* STA ACI value for background AC */
+#define EDCF_AC_BK_ECW_STA           0xA4      /* STA ECW value for background AC */
+#define EDCF_AC_BK_TXOP_STA          0x0000    /* STA TXOP value for background AC */
+#define EDCF_AC_VI_ACI_STA           0x42      /* STA ACI value for video AC */
+#define EDCF_AC_VI_ECW_STA           0x43      /* STA ECW value for video AC */
+#define EDCF_AC_VI_TXOP_STA          0x005e    /* STA TXOP value for video AC */
+#define EDCF_AC_VO_ACI_STA           0x62      /* STA ACI value for audio AC */
+#define EDCF_AC_VO_ECW_STA           0x32      /* STA ECW value for audio AC */
+#define EDCF_AC_VO_TXOP_STA          0x002f    /* STA TXOP value for audio AC */
+
+/* Default EDCF parameters that AP uses; WMM draft Table 14 */
+#define EDCF_AC_BE_ACI_AP            0x03      /* AP ACI value for best effort AC */
+#define EDCF_AC_BE_ECW_AP            0x64      /* AP ECW value for best effort AC */
+#define EDCF_AC_BE_TXOP_AP           0x0000    /* AP TXOP value for best effort AC */
+#define EDCF_AC_BK_ACI_AP            0x27      /* AP ACI value for background AC */
+#define EDCF_AC_BK_ECW_AP            0xA4      /* AP ECW value for background AC */
+#define EDCF_AC_BK_TXOP_AP           0x0000    /* AP TXOP value for background AC */
+#define EDCF_AC_VI_ACI_AP            0x41      /* AP ACI value for video AC */
+#define EDCF_AC_VI_ECW_AP            0x43      /* AP ECW value for video AC */
+#define EDCF_AC_VI_TXOP_AP           0x005e    /* AP TXOP value for video AC */
+#define EDCF_AC_VO_ACI_AP            0x61      /* AP ACI value for audio AC */
+#define EDCF_AC_VO_ECW_AP            0x32      /* AP ECW value for audio AC */
+#define EDCF_AC_VO_TXOP_AP           0x002f    /* AP TXOP value for audio AC */
+
+struct dot11_qbss_load_ie {
+       uint8 id;                       /* 11, DOT11_MNG_QBSS_LOAD_ID */
+       uint8 length;
+       uint16 station_count;           /* total number of STAs associated */
+       uint8 channel_utilization;      /* % of time, normalized to 255, QAP sensed medium busy */
+       uint16 aac;                     /* available admission capacity */
+} PACKED;
+typedef struct dot11_qbss_load_ie dot11_qbss_load_ie_t;
 
 /* nom_msdu_size */
 #define FIXED_MSDU_SIZE 0x8000         /* MSDU size is fixed */
@@ -436,8 +537,8 @@ typedef struct wme_tspec wme_tspec_t;
 
 /* surplus_bandwidth */
 /* Represented as 3 bits of integer, binary point, 13 bits fraction */
-#define        INTEGER_SHIFT   13
-#define FRACTION_MASK  0x1FFF
+#define        INTEGER_SHIFT   13      /* integer shift */
+#define FRACTION_MASK  0x1FFF  /* fraction mask */
 
 /* Management Notification Frame */
 struct dot11_management_notification {
@@ -450,14 +551,14 @@ struct dot11_management_notification {
 #define DOT11_MGMT_NOTIFICATION_LEN 4  /* Fixed length */
 
 /* WME Action Codes */
-#define WME_SETUP_REQUEST      0
-#define WME_SETUP_RESPONSE     1
-#define WME_TEARDOWN           2
+#define WME_ADDTS_REQUEST      0       /* WME ADDTS request */
+#define WME_ADDTS_RESPONSE     1       /* WME ADDTS response */
+#define WME_DELTS_REQUEST      2       /* WME DELTS request */
 
 /* WME Setup Response Status Codes */
-#define WME_ADMISSION_ACCEPTED 0
-#define WME_INVALID_PARAMETERS 1
-#define WME_ADMISSION_REFUSED  3
+#define WME_ADMISSION_ACCEPTED 0       /* WME admission accepted */
+#define WME_INVALID_PARAMETERS 1       /* WME invalide parameters */
+#define WME_ADMISSION_REFUSED  3       /* WME admission refused */
 
 /* Macro to take a pointer to a beacon or probe response
  * header and return the char* pointer to the SSID info element
@@ -465,307 +566,467 @@ struct dot11_management_notification {
 #define BCN_PRB_SSID(hdr) ((char*)(hdr) + DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_LEN)
 
 /* Authentication frame payload constants */
-#define DOT11_OPEN_SYSTEM      0
-#define DOT11_SHARED_KEY       1
-#define DOT11_CHALLENGE_LEN    128
+#define DOT11_OPEN_SYSTEM      0       /* d11 open authentication */
+#define DOT11_SHARED_KEY       1       /* d11 shared authentication */
+#define DOT11_CHALLENGE_LEN    128     /* d11 chanllenge text length */
 
 /* Frame control macros */
-#define FC_PVER_MASK           0x3
-#define FC_PVER_SHIFT          0
-#define FC_TYPE_MASK           0xC
-#define FC_TYPE_SHIFT          2
-#define FC_SUBTYPE_MASK                0xF0
-#define FC_SUBTYPE_SHIFT       4
-#define FC_TODS                        0x100
-#define FC_TODS_SHIFT          8
-#define FC_FROMDS              0x200
-#define FC_FROMDS_SHIFT                9
-#define FC_MOREFRAG            0x400
-#define FC_MOREFRAG_SHIFT      10
-#define FC_RETRY               0x800
-#define FC_RETRY_SHIFT         11
-#define FC_PM                  0x1000
-#define FC_PM_SHIFT            12
-#define FC_MOREDATA            0x2000
-#define FC_MOREDATA_SHIFT      13
-#define FC_WEP                 0x4000
-#define FC_WEP_SHIFT           14
-#define FC_ORDER               0x8000
-#define FC_ORDER_SHIFT         15
+#define FC_PVER_MASK           0x3     /* PVER mask */
+#define FC_PVER_SHIFT          0       /* PVER shift */
+#define FC_TYPE_MASK           0xC     /* type mask */
+#define FC_TYPE_SHIFT          2       /* type shift */
+#define FC_SUBTYPE_MASK                0xF0    /* subtype mask */
+#define FC_SUBTYPE_SHIFT       4       /* subtype shift */
+#define FC_TODS                        0x100   /* to DS */
+#define FC_TODS_SHIFT          8       /* to DS shift */
+#define FC_FROMDS              0x200   /* from DS */
+#define FC_FROMDS_SHIFT                9       /* from DS shift */
+#define FC_MOREFRAG            0x400   /* more frag. */
+#define FC_MOREFRAG_SHIFT      10      /* more frag. shift */
+#define FC_RETRY               0x800   /* retry */
+#define FC_RETRY_SHIFT         11      /* retry shift */
+#define FC_PM                  0x1000  /* PM */
+#define FC_PM_SHIFT            12      /* PM shift */
+#define FC_MOREDATA            0x2000  /* more data */
+#define FC_MOREDATA_SHIFT      13      /* more data shift */
+#define FC_WEP                 0x4000  /* WEP */
+#define FC_WEP_SHIFT           14      /* WEP shift */
+#define FC_ORDER               0x8000  /* order */
+#define FC_ORDER_SHIFT         15      /* order shift */
 
 /* sequence control macros */
-#define SEQNUM_SHIFT           4
-#define FRAGNUM_MASK           0xF
+#define SEQNUM_SHIFT           4       /* seq. number shift */
+#define SEQNUM_MAX             0x1000  /* max seqnum + 1 */
+#define FRAGNUM_MASK           0xF     /* frag. number mask */
 
 /* Frame Control type/subtype defs */
 
 /* FC Types */
-#define FC_TYPE_MNG            0
-#define FC_TYPE_CTL            1
-#define FC_TYPE_DATA           2
+#define FC_TYPE_MNG            0       /* management type */
+#define FC_TYPE_CTL            1       /* control type */
+#define FC_TYPE_DATA           2       /* data type */
 
 /* Management Subtypes */
-#define FC_SUBTYPE_ASSOC_REQ           0
-#define FC_SUBTYPE_ASSOC_RESP          1
-#define FC_SUBTYPE_REASSOC_REQ         2
-#define FC_SUBTYPE_REASSOC_RESP                3
-#define FC_SUBTYPE_PROBE_REQ           4
-#define FC_SUBTYPE_PROBE_RESP          5
-#define FC_SUBTYPE_BEACON              8
-#define FC_SUBTYPE_ATIM                        9
-#define FC_SUBTYPE_DISASSOC            10
-#define FC_SUBTYPE_AUTH                        11
-#define FC_SUBTYPE_DEAUTH              12
-#define FC_SUBTYPE_ACTION              13
+#define FC_SUBTYPE_ASSOC_REQ           0       /* assoc. request */
+#define FC_SUBTYPE_ASSOC_RESP          1       /* assoc. response */
+#define FC_SUBTYPE_REASSOC_REQ         2       /* reassoc. request */
+#define FC_SUBTYPE_REASSOC_RESP                3       /* reassoc. response */
+#define FC_SUBTYPE_PROBE_REQ           4       /* probe request */
+#define FC_SUBTYPE_PROBE_RESP          5       /* probe response */
+#define FC_SUBTYPE_BEACON              8       /* beacon */
+#define FC_SUBTYPE_ATIM                        9       /* ATIM */
+#define FC_SUBTYPE_DISASSOC            10      /* disassoc. */
+#define FC_SUBTYPE_AUTH                        11      /* authentication */
+#define FC_SUBTYPE_DEAUTH              12      /* de-authentication */
+#define FC_SUBTYPE_ACTION              13      /* action */
 
 /* Control Subtypes */
-#define FC_SUBTYPE_PS_POLL             10
-#define FC_SUBTYPE_RTS                 11
-#define FC_SUBTYPE_CTS                 12
-#define FC_SUBTYPE_ACK                 13
-#define FC_SUBTYPE_CF_END              14
-#define FC_SUBTYPE_CF_END_ACK          15
+#define FC_SUBTYPE_BLOCKACK_REQ                8       /* Block Ack Req */
+#define FC_SUBTYPE_BLOCKACK            9       /* Block Ack */
+#define FC_SUBTYPE_PS_POLL             10      /* PS poll */
+#define FC_SUBTYPE_RTS                 11      /* RTS */
+#define FC_SUBTYPE_CTS                 12      /* CTS */
+#define FC_SUBTYPE_ACK                 13      /* ACK */
+#define FC_SUBTYPE_CF_END              14      /* CF-END */
+#define FC_SUBTYPE_CF_END_ACK          15      /* CF-END ACK */
 
 /* Data Subtypes */
-#define FC_SUBTYPE_DATA                        0
-#define FC_SUBTYPE_DATA_CF_ACK         1
-#define FC_SUBTYPE_DATA_CF_POLL                2
-#define FC_SUBTYPE_DATA_CF_ACK_POLL    3
-#define FC_SUBTYPE_NULL                        4
-#define FC_SUBTYPE_CF_ACK              5
-#define FC_SUBTYPE_CF_POLL             6
-#define FC_SUBTYPE_CF_ACK_POLL         7
-#define FC_SUBTYPE_QOS_DATA            8
-#define FC_SUBTYPE_QOS_NULL            12
-
-/* type-subtype combos */
-#define FC_KIND_MASK           (FC_TYPE_MASK | FC_SUBTYPE_MASK)
-
-#define FC_KIND(t, s) (((t) << FC_TYPE_SHIFT) | ((s) << FC_SUBTYPE_SHIFT))
-
-#define FC_ASSOC_REQ   FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_REQ)
-#define FC_ASSOC_RESP  FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_RESP)
-#define FC_REASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_REQ)
-#define FC_REASSOC_RESP        FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_RESP)
-#define FC_PROBE_REQ   FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_REQ)
-#define FC_PROBE_RESP  FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_RESP)
-#define FC_BEACON      FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_BEACON)
-#define FC_DISASSOC    FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DISASSOC)
-#define FC_AUTH                FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_AUTH)
-#define FC_DEAUTH      FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DEAUTH)
-#define FC_ACTION      FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION)
-
-#define FC_PS_POLL     FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_PS_POLL)
-#define FC_RTS         FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_RTS)
-#define FC_CTS         FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTS)
-#define FC_ACK         FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_ACK)
-#define FC_CF_END      FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END)
-#define FC_CF_END_ACK  FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END_ACK)
-
-#define FC_DATA                FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA)
-#define FC_NULL_DATA   FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_NULL)
-#define FC_DATA_CF_ACK FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA_CF_ACK)
-#define FC_QOS_DATA    FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_DATA)
-#define FC_QOS_NULL    FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_NULL)
+#define FC_SUBTYPE_DATA                        0       /* Data */
+#define FC_SUBTYPE_DATA_CF_ACK         1       /* Data + CF-ACK */
+#define FC_SUBTYPE_DATA_CF_POLL                2       /* Data + CF-Poll */
+#define FC_SUBTYPE_DATA_CF_ACK_POLL    3       /* Data + CF-Ack + CF-Poll */
+#define FC_SUBTYPE_NULL                        4       /* Null */
+#define FC_SUBTYPE_CF_ACK              5       /* CF-Ack */
+#define FC_SUBTYPE_CF_POLL             6       /* CF-Poll */
+#define FC_SUBTYPE_CF_ACK_POLL         7       /* CF-Ack + CF-Poll */
+#define FC_SUBTYPE_QOS_DATA            8       /* QoS Data */
+#define FC_SUBTYPE_QOS_DATA_CF_ACK     9       /* QoS Data + CF-Ack */
+#define FC_SUBTYPE_QOS_DATA_CF_POLL    10      /* QoS Data + CF-Poll */
+#define FC_SUBTYPE_QOS_DATA_CF_ACK_POLL        11      /* QoS Data + CF-Ack + CF-Poll */
+#define FC_SUBTYPE_QOS_NULL            12      /* QoS Null */
+#define FC_SUBTYPE_QOS_CF_POLL         14      /* QoS CF-Poll */
+#define FC_SUBTYPE_QOS_CF_ACK_POLL     15      /* QoS CF-Ack + CF-Poll */
+
+/* Data Subtype Groups */
+#define FC_SUBTYPE_ANY_QOS(s)          (((s) & 8) != 0)
+#define FC_SUBTYPE_ANY_NULL(s)         (((s) & 4) != 0)
+#define FC_SUBTYPE_ANY_CF_POLL(s)      (((s) & 2) != 0)
+#define FC_SUBTYPE_ANY_CF_ACK(s)       (((s) & 1) != 0)
+
+/* Type/Subtype Combos */
+#define FC_KIND_MASK           (FC_TYPE_MASK | FC_SUBTYPE_MASK)        /* FC kind mask */
+
+#define FC_KIND(t, s)  (((t) << FC_TYPE_SHIFT) | ((s) << FC_SUBTYPE_SHIFT))    /* FC kind */
+
+#define FC_SUBTYPE(fc) (((fc) & FC_SUBTYPE_MASK) >> FC_SUBTYPE_SHIFT)  /* Subtype from FC */
+#define FC_TYPE(fc)    (((fc) & FC_TYPE_MASK) >> FC_TYPE_SHIFT)        /* Type from FC */
+
+#define FC_ASSOC_REQ   FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_REQ)      /* assoc. request */
+#define FC_ASSOC_RESP  FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_RESP)     /* assoc. response */
+#define FC_REASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_REQ)    /* reassoc. request */
+#define FC_REASSOC_RESP        FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_RESP)   /* reassoc. response */
+#define FC_PROBE_REQ   FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_REQ)      /* probe request */
+#define FC_PROBE_RESP  FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_RESP)     /* probe response */
+#define FC_BEACON      FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_BEACON)         /* beacon */
+#define FC_DISASSOC    FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DISASSOC)       /* disassoc */
+#define FC_AUTH                FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_AUTH)           /* authentication */
+#define FC_DEAUTH      FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DEAUTH)         /* deauthentication */
+#define FC_ACTION      FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION)         /* action */
+
+#define FC_BLOCKACK_REQ        FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK_REQ)   /* Block Ack Req */
+#define FC_BLOCKACK    FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK)       /* Block Ack */
+#define FC_PS_POLL     FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_PS_POLL)        /* PS poll */
+#define FC_RTS         FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_RTS)            /* RTS */
+#define FC_CTS         FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTS)            /* CTS */
+#define FC_ACK         FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_ACK)            /* ACK */
+#define FC_CF_END      FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END)         /* CF-END */
+#define FC_CF_END_ACK  FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END_ACK)     /* CF-END ACK */
+
+#define FC_DATA                FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA)          /* data */
+#define FC_NULL_DATA   FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_NULL)          /* null data */
+#define FC_DATA_CF_ACK FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA_CF_ACK)   /* data CF ACK */
+#define FC_QOS_DATA    FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_DATA)      /* QoS data */
+#define FC_QOS_NULL    FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_NULL)      /* QoS null */
 
 /* QoS Control Field */
 
-/* 802.1D Tag */
-#define QOS_PRIO_SHIFT         0
-#define QOS_PRIO_MASK          0x0007
-#define QOS_PRIO(qos)          (((qos) & QOS_PRIO_MASK) >> QOS_PRIO_SHIFT)
-
-/* Ack Policy (0 means Acknowledge) */
-#define QOS_ACK_SHIFT          5
-#define QOS_ACK_MASK           0x0060
-#define QOS_ACK(qos)           (((qos) & QOS_ACK_MASK) >> QOS_ACK_SHIFT)
+/* 802.1D Priority */
+#define QOS_PRIO_SHIFT         0       /* QoS priority shift */
+#define QOS_PRIO_MASK          0x0007  /* QoS priority mask */
+#define QOS_PRIO(qos)          (((qos) & QOS_PRIO_MASK) >> QOS_PRIO_SHIFT)     /* QoS priority */
+
+/* Traffic Identifier */
+#define QOS_TID_SHIFT          0       /* QoS TID shift */
+#define QOS_TID_MASK           0x000f  /* QoS TID mask */
+#define QOS_TID(qos)           (((qos) & QOS_TID_MASK) >> QOS_TID_SHIFT)       /* QoS TID */
+
+/* End of Service Period (U-APSD) */
+#define QOS_EOSP_SHIFT         4       /* QoS End of Service Period shift */
+#define QOS_EOSP_MASK          0x0010  /* QoS End of Service Period mask */
+#define QOS_EOSP(qos)          (((qos) & QOS_EOSP_MASK) >> QOS_EOSP_SHIFT)     /* Qos EOSP */
+
+/* Ack Policy */
+#define QOS_ACK_NORMAL_ACK     0       /* Normal Ack */
+#define QOS_ACK_NO_ACK         1       /* No Ack (eg mcast) */
+#define QOS_ACK_NO_EXP_ACK     2       /* No Explicit Ack */
+#define QOS_ACK_BLOCK_ACK      3       /* Block Ack */
+#define QOS_ACK_SHIFT          5       /* QoS ACK shift */
+#define QOS_ACK_MASK           0x0060  /* QoS ACK mask */
+#define QOS_ACK(qos)           (((qos) & QOS_ACK_MASK) >> QOS_ACK_SHIFT)       /* QoS ACK */
+
+/* A-MSDU flag */
+#define QOS_AMSDU_SHIFT                7       /* AMSDU shift */
+#define QOS_AMSDU_MASK         0x0080  /* AMSDU mask */
 
 /* Management Frames */
 
 /* Management Frame Constants */
 
 /* Fixed fields */
-#define DOT11_MNG_AUTH_ALGO_LEN                2
-#define DOT11_MNG_AUTH_SEQ_LEN         2
-#define DOT11_MNG_BEACON_INT_LEN       2
-#define DOT11_MNG_CAP_LEN              2
-#define DOT11_MNG_AP_ADDR_LEN          6
-#define DOT11_MNG_LISTEN_INT_LEN       2
-#define DOT11_MNG_REASON_LEN           2
-#define DOT11_MNG_AID_LEN              2
-#define DOT11_MNG_STATUS_LEN           2
-#define DOT11_MNG_TIMESTAMP_LEN                8
+#define DOT11_MNG_AUTH_ALGO_LEN                2       /* d11 management auth. algo. length */
+#define DOT11_MNG_AUTH_SEQ_LEN         2       /* d11 management auth. seq. length */
+#define DOT11_MNG_BEACON_INT_LEN       2       /* d11 management beacon interval length */
+#define DOT11_MNG_CAP_LEN              2       /* d11 management cap. length */
+#define DOT11_MNG_AP_ADDR_LEN          6       /* d11 management AP address length */
+#define DOT11_MNG_LISTEN_INT_LEN       2       /* d11 management listen interval length */
+#define DOT11_MNG_REASON_LEN           2       /* d11 management reason length */
+#define DOT11_MNG_AID_LEN              2       /* d11 management AID length */
+#define DOT11_MNG_STATUS_LEN           2       /* d11 management status length */
+#define DOT11_MNG_TIMESTAMP_LEN                8       /* d11 management timestamp length */
 
 /* DUR/ID field in assoc resp is 0xc000 | AID */
-#define DOT11_AID_MASK                 0x3fff
+#define DOT11_AID_MASK                 0x3fff  /* d11 AID mask */
 
 /* Reason Codes */
-#define DOT11_RC_RESERVED                      0
+#define DOT11_RC_RESERVED                      0       /* d11 RC reserved */
 #define DOT11_RC_UNSPECIFIED                   1       /* Unspecified reason */
-#define DOT11_RC_AUTH_INVAL                    2       /* Previous authentication no longer valid */
-#define DOT11_RC_DEAUTH_LEAVING                        3       /* Deauthenticated because sending station is
-                                                          leaving (or has left) IBSS or ESS */
+#define DOT11_RC_AUTH_INVAL                    2       /* Previous authentication no longer
+                                                        * valid
+                                                        */
+#define DOT11_RC_DEAUTH_LEAVING                        3       /* Deauthenticated because sending station
+                                                        * is leaving (or has left) IBSS or ESS
+                                                        */
 #define DOT11_RC_INACTIVITY                    4       /* Disassociated due to inactivity */
-#define DOT11_RC_BUSY                          5       /* Disassociated because AP is unable to handle
-                                                          all currently associated stations */
+#define DOT11_RC_BUSY                          5       /* Disassociated because AP is unable
+                                                        * to handle all currently associated
+                                                        * stations
+                                                        */
 #define DOT11_RC_INVAL_CLASS_2                 6       /* Class 2 frame received from
-                                                          nonauthenticated station */
+                                                        * nonauthenticated station
+                                                        */
 #define DOT11_RC_INVAL_CLASS_3                 7       /* Class 3 frame received from
-                                                          nonassociated station */
+                                                        *  nonassociated station
+                                                        */
 #define DOT11_RC_DISASSOC_LEAVING              8       /* Disassociated because sending station is
-                                                          leaving (or has left) BSS */
+                                                        * leaving (or has left) BSS
+                                                        */
 #define DOT11_RC_NOT_AUTH                      9       /* Station requesting (re)association is
-                                                          not authenticated with responding station */
+                                                        * not authenticated with responding
+                                                        * station
+                                                        */
 #define DOT11_RC_MAX                           23      /* Reason codes > 23 are reserved */
 
 /* Status Codes */
 #define DOT11_STATUS_SUCCESS                   0       /* Successful */
 #define DOT11_STATUS_FAILURE                   1       /* Unspecified failure */
-#define DOT11_STATUS_CAP_MISMATCH              10      /* Cannot support all requested capabilities
-                                                          in the Capability Information field */
-#define DOT11_STATUS_REASSOC_FAIL              11      /* Reassociation denied due to inability to
-                                                          confirm that association exists */
-#define DOT11_STATUS_ASSOC_FAIL                        12      /* Association denied due to reason outside
-                                                          the scope of this standard */
-#define DOT11_STATUS_AUTH_MISMATCH             13      /* Responding station does not support the
-                                                          specified authentication algorithm */
-#define DOT11_STATUS_AUTH_SEQ                  14      /* Received an Authentication frame with
-                                                          authentication transaction sequence number
-                                                          out of expected sequence */
-#define DOT11_STATUS_AUTH_CHALLENGE_FAIL       15      /* Authentication rejected because of challenge failure */
-#define DOT11_STATUS_AUTH_TIMEOUT              16      /* Authentication rejected due to timeout waiting
-                                                          for next frame in sequence */
-#define DOT11_STATUS_ASSOC_BUSY_FAIL           17      /* Association denied because AP is unable to
-                                                          handle additional associated stations */
-#define DOT11_STATUS_ASSOC_RATE_MISMATCH       18      /* Association denied due to requesting station
-                                                          not supporting all of the data rates in the
-                                                          BSSBasicRateSet parameter */
-#define DOT11_STATUS_ASSOC_SHORT_REQUIRED      19      /* Association denied due to requesting station
-                                                          not supporting the Short Preamble option */
-#define DOT11_STATUS_ASSOC_PBCC_REQUIRED       20      /* Association denied due to requesting station
-                                                          not supporting the PBCC Modulation option */
-#define DOT11_STATUS_ASSOC_AGILITY_REQUIRED    21      /* Association denied due to requesting station
-                                                          not supporting the Channel Agility option */
-#define DOT11_STATUS_ASSOC_SPECTRUM_REQUIRED   22      /* Association denied because Spectrum Management 
-                                                          capability is required. */
-#define DOT11_STATUS_ASSOC_BAD_POWER_CAP       23      /* Association denied because the info in the 
-                                                          Power Cap element is unacceptable. */
-#define DOT11_STATUS_ASSOC_BAD_SUP_CHANNELS    24      /* Association denied because the info in the 
-                                                          Supported Channel element is unacceptable */
-#define DOT11_STATUS_ASSOC_SHORTSLOT_REQUIRED  25      /* Association denied due to requesting station
-                                                          not supporting the Short Slot Time option */
-#define DOT11_STATUS_ASSOC_ERPBCC_REQUIRED     26      /* Association denied due to requesting station
-                                                          not supporting the ER-PBCC Modulation option */
-#define DOT11_STATUS_ASSOC_DSSOFDM_REQUIRED    27      /* Association denied due to requesting station
-                                                          not supporting the DSS-OFDM option */
+#define DOT11_STATUS_CAP_MISMATCH              10      /* Cannot support all requested
+                                                        * capabilities in the Capability
+                                                        * Information field
+                                                        */
+#define DOT11_STATUS_REASSOC_FAIL              11      /* Reassociation denied due to inability
+                                                        * to confirm that association exists
+                                                        */
+#define DOT11_STATUS_ASSOC_FAIL                        12      /* Association denied due to reason
+                                                        * outside the scope of this standard
+                                                        */
+#define DOT11_STATUS_AUTH_MISMATCH             13      /* Responding station does not support
+                                                        * the specified authentication
+                                                        * algorithm
+                                                        */
+#define DOT11_STATUS_AUTH_SEQ                  14      /* Received an Authentication frame
+                                                        * with authentication transaction
+                                                        * sequence number out of expected
+                                                        * sequence
+                                                        */
+#define DOT11_STATUS_AUTH_CHALLENGE_FAIL       15      /* Authentication rejected because of
+                                                        * challenge failure
+                                                        */
+#define DOT11_STATUS_AUTH_TIMEOUT              16      /* Authentication rejected due to timeout
+                                                        * waiting for next frame in sequence
+                                                        */
+#define DOT11_STATUS_ASSOC_BUSY_FAIL           17      /* Association denied because AP is
+                                                        * unable to handle additional
+                                                        * associated stations
+                                                        */
+#define DOT11_STATUS_ASSOC_RATE_MISMATCH       18      /* Association denied due to requesting
+                                                        * station not supporting all of the
+                                                        * data rates in the BSSBasicRateSet
+                                                        * parameter
+                                                        */
+#define DOT11_STATUS_ASSOC_SHORT_REQUIRED      19      /* Association denied due to requesting
+                                                        * station not supporting the Short
+                                                        * Preamble option
+                                                        */
+#define DOT11_STATUS_ASSOC_PBCC_REQUIRED       20      /* Association denied due to requesting
+                                                        * station not supporting the PBCC
+                                                        * Modulation option
+                                                        */
+#define DOT11_STATUS_ASSOC_AGILITY_REQUIRED    21      /* Association denied due to requesting
+                                                        * station not supporting the Channel
+                                                        * Agility option
+                                                        */
+#define DOT11_STATUS_ASSOC_SPECTRUM_REQUIRED   22      /* Association denied because Spectrum
+                                                        * Management capability is required.
+                                                        */
+#define DOT11_STATUS_ASSOC_BAD_POWER_CAP       23      /* Association denied because the info
+                                                        * in the Power Cap element is
+                                                        * unacceptable.
+                                                        */
+#define DOT11_STATUS_ASSOC_BAD_SUP_CHANNELS    24      /* Association denied because the info
+                                                        * in the Supported Channel element is
+                                                        * unacceptable
+                                                        */
+#define DOT11_STATUS_ASSOC_SHORTSLOT_REQUIRED  25      /* Association denied due to requesting
+                                                        * station not supporting the Short Slot
+                                                        * Time option
+                                                        */
+#define DOT11_STATUS_ASSOC_ERPBCC_REQUIRED     26      /* Association denied due to requesting
+                                                        * station not supporting the ER-PBCC
+                                                        * Modulation option
+                                                        */
+#define DOT11_STATUS_ASSOC_DSSOFDM_REQUIRED    27      /* Association denied due to requesting
+                                                        * station not supporting the DSS-OFDM
+                                                        * option
+                                                        */
 
 /* Info Elts, length of INFORMATION portion of Info Elts */
-#define DOT11_MNG_DS_PARAM_LEN                 1
-#define DOT11_MNG_IBSS_PARAM_LEN               2
+#define DOT11_MNG_DS_PARAM_LEN                 1       /* d11 management DS parameter length */
+#define DOT11_MNG_IBSS_PARAM_LEN               2       /* d11 management IBSS parameter length */
 
 /* TIM Info element has 3 bytes fixed info in INFORMATION field,
- * followed by 1 to 251 bytes of Partial Virtual Bitmap */
-#define DOT11_MNG_TIM_FIXED_LEN                        3
-#define DOT11_MNG_TIM_DTIM_COUNT               0
-#define DOT11_MNG_TIM_DTIM_PERIOD              1
-#define DOT11_MNG_TIM_BITMAP_CTL               2
-#define DOT11_MNG_TIM_PVB                      3
+ * followed by 1 to 251 bytes of Partial Virtual Bitmap
+ */
+#define DOT11_MNG_TIM_FIXED_LEN                        3       /* d11 management TIM fixed length */
+#define DOT11_MNG_TIM_DTIM_COUNT               0       /* d11 management DTIM count */
+#define DOT11_MNG_TIM_DTIM_PERIOD              1       /* d11 management DTIM period */
+#define DOT11_MNG_TIM_BITMAP_CTL               2       /* d11 management TIM BITMAP control  */
+#define DOT11_MNG_TIM_PVB                      3       /* d11 management TIM PVB */
 
 /* TLV defines */
-#define TLV_TAG_OFF            0
-#define TLV_LEN_OFF            1
-#define TLV_HDR_LEN            2
-#define TLV_BODY_OFF           2
+#define TLV_TAG_OFF            0       /* tag offset */
+#define TLV_LEN_OFF            1       /* length offset */
+#define TLV_HDR_LEN            2       /* header length */
+#define TLV_BODY_OFF           2       /* body offset */
 
 /* Management Frame Information Element IDs */
-#define DOT11_MNG_SSID_ID                      0
-#define DOT11_MNG_RATES_ID                     1
-#define DOT11_MNG_FH_PARMS_ID                  2
-#define DOT11_MNG_DS_PARMS_ID                  3
-#define DOT11_MNG_CF_PARMS_ID                  4
-#define DOT11_MNG_TIM_ID                       5
-#define DOT11_MNG_IBSS_PARMS_ID                        6
-#define DOT11_MNG_COUNTRY_ID                   7
-#define DOT11_MNG_HOPPING_PARMS_ID             8
-#define DOT11_MNG_HOPPING_TABLE_ID             9
-#define DOT11_MNG_REQUEST_ID                   10
-#define DOT11_MNG_CHALLENGE_ID                 16
+#define DOT11_MNG_SSID_ID                      0       /* d11 management SSID id */
+#define DOT11_MNG_RATES_ID                     1       /* d11 management rates id */
+#define DOT11_MNG_FH_PARMS_ID                  2       /* d11 management FH parameter id */
+#define DOT11_MNG_DS_PARMS_ID                  3       /* d11 management DS parameter id */
+#define DOT11_MNG_CF_PARMS_ID                  4       /* d11 management CF parameter id */
+#define DOT11_MNG_TIM_ID                       5       /* d11 management TIM id */
+#define DOT11_MNG_IBSS_PARMS_ID                        6       /* d11 management IBSS parameter id */
+#define DOT11_MNG_COUNTRY_ID                   7       /* d11 management country id */
+#define DOT11_MNG_HOPPING_PARMS_ID             8       /* d11 management hopping parameter id */
+#define DOT11_MNG_HOPPING_TABLE_ID             9       /* d11 management hopping table id */
+#define DOT11_MNG_REQUEST_ID                   10      /* d11 management request id */
+#define DOT11_MNG_QBSS_LOAD_ID                         11      /* d11 management QBSS Load id */
+#define DOT11_MNG_CHALLENGE_ID                 16      /* d11 management chanllenge id */
 #define DOT11_MNG_PWR_CONSTRAINT_ID            32    /* 11H PowerConstraint    */
 #define DOT11_MNG_PWR_CAP_ID                   33    /* 11H PowerCapability    */
 #define DOT11_MNG_TPC_REQUEST_ID               34    /* 11H TPC Request        */
 #define DOT11_MNG_TPC_REPORT_ID                        35    /* 11H TPC Report         */
 #define DOT11_MNG_SUPP_CHANNELS_ID             36    /* 11H Supported Channels */
-#define DOT11_MNG_CHANNEL_SWITCH_ID            37    /* 11H ChannelSwitch Announcement*/
+#define DOT11_MNG_CHANNEL_SWITCH_ID            37    /* 11H ChannelSwitch Announcement */
 #define DOT11_MNG_MEASURE_REQUEST_ID           38    /* 11H MeasurementRequest */
 #define DOT11_MNG_MEASURE_REPORT_ID            39    /* 11H MeasurementReport  */
 #define DOT11_MNG_QUIET_ID                     40    /* 11H Quiet              */
 #define DOT11_MNG_IBSS_DFS_ID                  41    /* 11H IBSS_DFS           */
-#define DOT11_MNG_ERP_ID                       42
-#define DOT11_MNG_NONERP_ID                    47
-#define DOT11_MNG_EXT_RATES_ID                 50
-#define DOT11_MNG_WPA_ID                       221
-#define DOT11_MNG_PROPR_ID                     221
+#define DOT11_MNG_ERP_ID                       42      /* d11 management ERP id */
+#define DOT11_MNG_TS_DELAY_ID                  43      /* d11 management TS Delay id */
+#define DOT11_MNG_NONERP_ID                    47      /* d11 management NON-ERP id */
+#define DOT11_MNG_RSN_ID                       48      /* d11 management RSN id */
+#define DOT11_MNG_EXT_RATES_ID                 50      /* d11 management ext. rates id */
+#define DOT11_MNG_WPA_ID                       221     /* d11 management WPA id */
+#define DOT11_MNG_PROPR_ID                     221     /* d11 management proprietary id */
+
+/* Rate element Basic flag and rate mask */
+#define DOT11_RATE_BASIC                       0x80    /* flag for a Basic Rate */
+#define DOT11_RATE_MASK                                0x7F    /* mask for numeric part of rate */
 
 /* ERP info element bit values */
 #define DOT11_MNG_ERP_LEN                      1       /* ERP is currently 1 byte long */
-#define DOT11_MNG_NONERP_PRESENT               0x01    /* NonERP (802.11b) STAs are present in the BSS */
-#define DOT11_MNG_USE_PROTECTION               0x02    /* Use protection mechanisms for ERP-OFDM frames */
-#define DOT11_MNG_BARKER_PREAMBLE              0x04    /* Short Preambles: 0 == allowed, 1 == not allowed */
+#define DOT11_MNG_NONERP_PRESENT               0x01    /* NonERP (802.11b) STAs are present
+                                                        *in the BSS
+                                                        */
+#define DOT11_MNG_USE_PROTECTION               0x02    /* Use protection mechanisms for
+                                                        *ERP-OFDM frames
+                                                        */
+#define DOT11_MNG_BARKER_PREAMBLE              0x04    /* Short Preambles: 0 == allowed,
+                                                        * 1 == not allowed
+                                                        */
+/* TS Delay element offset & size */
+#define DOT11_MGN_TS_DELAY_LEN         4       /* length of TS DELAY IE */
+#define TS_DELAY_FIELD_SIZE                    4       /* TS DELAY field size */
 
 /* Capability Information Field */
-#define DOT11_CAP_ESS                          0x0001
-#define DOT11_CAP_IBSS                         0x0002
-#define DOT11_CAP_POLLABLE                     0x0004
-#define DOT11_CAP_POLL_RQ                      0x0008
-#define DOT11_CAP_PRIVACY                      0x0010
-#define DOT11_CAP_SHORT                                0x0020
-#define DOT11_CAP_PBCC                         0x0040
-#define DOT11_CAP_AGILITY                      0x0080
-#define DOT11_CAP_SPECTRUM                     0x0100
-#define DOT11_CAP_SHORTSLOT                    0x0400
-#define DOT11_CAP_CCK_OFDM                     0x2000
+#define DOT11_CAP_ESS                          0x0001  /* d11 cap. ESS */
+#define DOT11_CAP_IBSS                         0x0002  /* d11 cap. IBSS */
+#define DOT11_CAP_POLLABLE                     0x0004  /* d11 cap. pollable */
+#define DOT11_CAP_POLL_RQ                      0x0008  /* d11 cap. poll request */
+#define DOT11_CAP_PRIVACY                      0x0010  /* d11 cap. privacy */
+#define DOT11_CAP_SHORT                                0x0020  /* d11 cap. short */
+#define DOT11_CAP_PBCC                         0x0040  /* d11 cap. PBCC */
+#define DOT11_CAP_AGILITY                      0x0080  /* d11 cap. agility */
+#define DOT11_CAP_SPECTRUM                     0x0100  /* d11 cap. spectrum */
+#define DOT11_CAP_SHORTSLOT                    0x0400  /* d11 cap. shortslot */
+#define DOT11_CAP_CCK_OFDM                     0x2000  /* d11 cap. CCK/OFDM */
 
 /* Action Frame Constants */
-#define DOT11_ACTION_CAT_ERR_MASK      0x80
-#define DOT11_ACTION_CAT_SPECT_MNG     0x00
+#define DOT11_ACTION_CAT_ERR_MASK      0x80    /* d11 action category error mask */
+#define DOT11_ACTION_CAT_MASK          0x7F    /* d11 action category mask */
+#define DOT11_ACTION_CAT_SPECT_MNG     0x00    /* d11 action category spectrum management */
+#define DOT11_ACTION_CAT_BLOCKACK      0x03    /* d11 action category block ack */
 #define DOT11_ACTION_NOTIFICATION      0x11    /* 17 */
 
-#define DOT11_ACTION_ID_M_REQ          0
-#define DOT11_ACTION_ID_M_REP          1
-#define DOT11_ACTION_ID_TPC_REQ                2
-#define DOT11_ACTION_ID_TPC_REP                3
-#define DOT11_ACTION_ID_CHANNEL_SWITCH 4
+#define DOT11_ACTION_ID_M_REQ          0       /* d11 action measurement request */
+#define DOT11_ACTION_ID_M_REP          1       /* d11 action measurement response */
+#define DOT11_ACTION_ID_TPC_REQ                2       /* d11 action TPC request */
+#define DOT11_ACTION_ID_TPC_REP                3       /* d11 action TPC response */
+#define DOT11_ACTION_ID_CHANNEL_SWITCH 4               /* d11 action channel switch */
+
+/* HT (EWC) action ids */
+#define DOT11_ACTION_ID_HT_CH_WIDTH    0       /* mimo ps action frame id */
+#define DOT11_ACTION_ID_HT_MIMO_PS     1       /* mimo ps action frame id */
+
+/* Block Ack action types */
+#define DOT11_BA_ACTION_ADDBA_REQ      0       /* ADDBA Req action frame type */
+#define DOT11_BA_ACTION_ADDBA_RESP     1       /* ADDBA Resp action frame type */
+#define DOT11_BA_ACTION_DELBA          2       /* DELBA action frame type */
+
+/* ADDBA action parameters */
+#define DOT11_ADDBA_PARAM_POLICY_MASK  0x0002  /* policy mask(ack vs delayed) */
+#define DOT11_ADDBA_PARAM_POLICY_SHIFT 1       /* policy shift */
+#define DOT11_ADDBA_PARAM_TID_MASK     0x003c  /* tid mask */
+#define DOT11_ADDBA_PARAM_TID_SHIFT    2       /* tid shift */
+#define DOT11_ADDBA_PARAM_BSIZE_MASK   0xffc0  /* buffer size mask */
+#define DOT11_ADDBA_PARAM_BSIZE_SHIFT  6       /* buffer size shift */
+
+#define DOT11_ADDBA_POLICY_DELAYED     0       /* delayed BA policy */
+#define DOT11_ADDBA_POLICY_IMMEDIATE   1       /* immediate BA policy */
+
+struct dot11_addba_req {
+       uint8 category;                         /* category of action frame (3) */
+       uint8 action;                           /* action: addba req */
+       uint8 token;                            /* identifier */
+       uint16 addba_param_set;                 /* parameter set */
+       uint16 timeout;                         /* timeout in seconds */
+       uint16 start_seqnum;                    /* starting sequence number */
+}PACKED;
+typedef struct dot11_addba_req dot11_addba_req_t;
+#define DOT11_ADDBA_REQ_LEN            9       /* length of addba req frame */
+
+struct dot11_addba_resp {
+       uint8 category;                         /* category of action frame (3) */
+       uint8 action;                           /* action: addba resp */
+       uint8 token;                            /* identifier */
+       uint16 status;                          /* status of add request */
+       uint16 addba_param_set;                 /* negotiated parameter set */
+       uint16 timeout;                         /* negotiated timeout in seconds */
+}PACKED;
+typedef struct dot11_addba_resp dot11_addba_resp_t;
+#define DOT11_ADDBA_RESP_LEN           9       /* length of addba resp frame */
+
+/* DELBA action parameters */
+#define DOT11_DELBA_PARAM_INIT_MASK    0x0800  /* initiator mask */
+#define DOT11_DELBA_PARAM_INIT_SHIFT   11      /* initiator shift */
+#define DOT11_DELBA_PARAM_TID_MASK     0xf000  /* tid mask */
+#define DOT11_DELBA_PARAM_TID_SHIFT    12      /* tid shift */
+
+struct dot11_delba {
+       uint8 category;                         /* category of action frame (3) */
+       uint8 action;                           /* action: addba req */
+       uint16 delba_param_set;                 /* paarmeter set */
+       uint16 reason;                          /* reason for dellba */
+}PACKED;
+typedef struct dot11_delba dot11_delba_t;
+#define DOT11_DELBA_LEN                        6       /* length of delba frame */
 
 /* MLME Enumerations */
-#define DOT11_BSSTYPE_INFRASTRUCTURE           0
-#define DOT11_BSSTYPE_INDEPENDENT              1
-#define DOT11_BSSTYPE_ANY                      2
-#define DOT11_SCANTYPE_ACTIVE                  0
-#define DOT11_SCANTYPE_PASSIVE                 1
+#define DOT11_BSSTYPE_INFRASTRUCTURE           0       /* d11 infrastructure */
+#define DOT11_BSSTYPE_INDEPENDENT              1       /* d11 independent */
+#define DOT11_BSSTYPE_ANY                      2       /* d11 any BSS type */
+#define DOT11_SCANTYPE_ACTIVE                  0       /* d11 scan active */
+#define DOT11_SCANTYPE_PASSIVE                 1       /* d11 scan passive */
+
+/* 802.11 BRCM "Compromise" Pre N constants */
+#define PREN_PREAMBLE          24      /* green field preamble time */
+#define PREN_MM_EXT            16      /* extra mixed mode preamble time */
+#define PREN_PREAMBLE_EXT      4       /* extra preamble (multiply by unique_streams-1) */
 
 /* 802.11 A PHY constants */
-#define APHY_SLOT_TIME         9
-#define APHY_SIFS_TIME         16
-#define APHY_DIFS_TIME         (APHY_SIFS_TIME + (2 * APHY_SLOT_TIME))
-#define APHY_PREAMBLE_TIME     16
-#define APHY_SIGNAL_TIME       4
-#define APHY_SYMBOL_TIME       4
-#define APHY_SERVICE_NBITS     16
-#define APHY_TAIL_NBITS                6
-#define        APHY_CWMIN              15
+#define APHY_SLOT_TIME         9       /* APHY slot time */
+#define APHY_SIFS_TIME         16      /* APHY SIFS time */
+#define APHY_DIFS_TIME         (APHY_SIFS_TIME + (2 * APHY_SLOT_TIME)) /* APHY DIFS time */
+#define APHY_PREAMBLE_TIME     16      /* APHY preamble time */
+#define APHY_SIGNAL_TIME       4       /* APHY signal time */
+#define APHY_SYMBOL_TIME       4       /* APHY symbol time */
+#define APHY_SERVICE_NBITS     16      /* APHY service nbits */
+#define APHY_TAIL_NBITS                6       /* APHY tail nbits */
+#define        APHY_CWMIN              15      /* APHY cwmin */
 
 /* 802.11 B PHY constants */
-#define BPHY_SLOT_TIME         20
-#define BPHY_SIFS_TIME         10
-#define BPHY_DIFS_TIME         50
-#define BPHY_PLCP_TIME         192
-#define BPHY_PLCP_SHORT_TIME   96
-#define        BPHY_CWMIN              31
+#define BPHY_SLOT_TIME         20      /* BPHY slot time */
+#define BPHY_SIFS_TIME         10      /* BPHY SIFS time */
+#define BPHY_DIFS_TIME         50      /* BPHY DIFS time */
+#define BPHY_PLCP_TIME         192     /* BPHY PLCP time */
+#define BPHY_PLCP_SHORT_TIME   96      /* BPHY PLCP short time */
+#define        BPHY_CWMIN              31      /* BPHY cwmin */
 
 /* 802.11 G constants */
-#define DOT11_OFDM_SIGNAL_EXTENSION    6
+#define DOT11_OFDM_SIGNAL_EXTENSION    6       /* d11 OFDM signal extension */
 
-#define PHY_CWMAX              1023
+#define PHY_CWMAX              1023    /* PHY cwmax */
 
 #define        DOT11_MAXNUMFRAGS       16      /* max # fragments per MSDU */
 
@@ -788,41 +1049,186 @@ typedef struct d11cnt {
 } d11cnt_t;
 
 /* BRCM OUI */
-#define BRCM_OUI               "\x00\x10\x18"
+#define BRCM_OUI               "\x00\x10\x18"  /* Broadcom OUI */
+
+/* OUI for BRCM proprietary IE */
+#define BRCM_PROP_OUI          "\x00\x90\x4C"  /* Broadcom proprietary OUI */
 
 /* BRCM info element */
 struct brcm_ie {
-       uchar   id;             
-       uchar   len;   
-       uchar   oui[3];
-       uchar   ver;
-       uchar   assoc;          /*  # of assoc STAs */
-       uchar   flags;          /* misc flags */
-} PACKED;
-#define BRCM_IE_LEN            8
+       uint8   id;             /* IE ID, 221, DOT11_MNG_PROPR_ID */
+       uint8   len;            /* IE length */
+       uint8   oui[3];         /* Proprietary OUI, BRCM_OUI */
+       uint8   ver;            /* type/ver of this IE */
+       uint8   assoc;          /* # of assoc STAs */
+       uint8   flags;          /* misc flags */
+       uint8   flags1;         /* misc flags */
+       uint16  amsdu_mtu_pref; /* preferred A-MSDU MTU */
+} PACKED;
 typedef        struct brcm_ie brcm_ie_t;
-#define BRCM_IE_VER            1
+#define BRCM_IE_LEN            11      /* BRCM IE length */
+#define BRCM_IE_VER            2       /* BRCM IE version */
+#define BRCM_IE_LEGACY_AES_VER 1       /* BRCM IE legacy AES version */
 
 /* brcm_ie flags */
 #define        BRF_ABCAP               0x1     /* afterburner capable */
 #define        BRF_ABRQRD              0x2     /* afterburner requested */
+#define        BRF_LZWDS               0x4     /* lazy wds enabled */
+#define        BRF_BLOCKACK            0x8     /* BlockACK capable */
+#define BRF_ABCOUNTER_MASK     0xf0    /* afterburner wds "state" counter */
+#define BRF_ABCOUNTER_SHIFT    4       /* offset of afterburner wds "state" counter */
+
+/* brcm_ie flags1 */
+#define        BRF1_AMSDU              0x1     /* A-MSDU capable */
+
+#define AB_WDS_TIMEOUT_MAX     15      /* afterburner wds Max count indicating not
+                                        * locally capable
+                                        */
+#define AB_WDS_TIMEOUT_MIN     1       /* afterburner wds, use zero count as indicating
+                                        * "downrev"
+                                        */
+
+/* EWC definitions */
+#define MCSSET_LEN     16      /* 16-bits per 8-bit set to give 128-bits bitmap of MCS Index */
+
+struct ewc_cap {
+       uint16  cap;
+       uint8   params;
+       uint8   supp_mcs[MCSSET_LEN];
+       uint16  ext_htcap;
+       uint32  txbf_cap;
+       uint8   as_cap;
+} PACKED;
+typedef struct ewc_cap ewc_cap_t;
+
+/* CAP IE: EWC 1.0 spec. simply stole a 802.11 IE, we use our prop. IE until this is resolved */
+/* the capability IE is primarily used to convey this nodes abilities */
+struct ewc_cap_ie {
+       uint8   id;             /* IE ID, 221, DOT11_MNG_PROPR_ID */
+       uint8   len;            /* IE length */
+       uint8   oui[3];         /* Proprietary OUI, BRCM_PROP_OUI */
+       uint8   type;           /* type inidicates what follows */
+       ewc_cap_t cap;
+} PACKED;
+typedef struct ewc_cap_ie ewc_cap_ie_t;
+
+#define EWC_CAP_IE_LEN (26+4)  
+#define EWC_CAP_IE_TYPE        51      
+
+#define EWC_CAP_ADC_CODING     0x0001  /* Advance coding support */
+#define EWC_CAP_40MHZ          0x0002  /* FALSE:20Mhz, TRUE: 20 and 40MHZ supported */
+#define EWC_CAP_MIMO_PS_MASK   0x000C  /* Mimo PS mask */
+#define EWC_CAP_MIMO_PS_SHIFT  0x0002  /* Mimo PS shift */
+#define EWC_CAP_MIMO_PS_OFF    0x0003  /* Mimo PS, no restriction */
+#define EWC_CAP_MIMO_PS_RTS    0x0001  /* Mimo PS, send RTS/CTS around MIMO frames */
+#define EWC_CAP_MIMO_PS_ON     0x0000  /* Mimo PS, MIMO disallowed */
+#define EWC_CAP_GF             0x0010  /* Greenfield preamble support */
+#define EWC_CAP_SHORT_GI_20    0x0020  /* 20MHZ short guard interval support */
+#define EWC_CAP_SHORT_GI_40    0x0040  /* 40Mhz short guard interval support */
+#define EWC_CAP_TX_STBC                0x0080  /* Tx STBC support */
+#define EWC_CAP_RX_STBC_MASK   0x0300  /* Rx STBC mask */
+#define EWC_CAP_RX_STBC_SHIFT  8       /* Rx STBC shift */
+#define EWC_CAP_DELAYED_BA     0x0400  /* delayed BA support */
+#define EWC_CAP_MAX_AMSDU      0x0800  /* Max AMSDU size in bytes , 0=3839, 1=7935 */
+#define EWC_CAP_DSSS_CCK       0x1000  /* DSSS/CCK supported by the BSS */
+#define EWC_CAP_PSMP           0x2000  /* Power Save Multi Poll support */
+#define EWC_CAP_STBC_CTL       0x4000  /* STBC control frame support */
+#define EWC_CAP_LSIG_TXOP      0x8000  /* L-SIG TXOP protection support */
+
+#define EWC_MAX_AMSDU          7935    /* max amsdu size (bytes) per the EWC spec */
+#define EWC_MIN_AMSDU          3835    /* min amsdu size (bytes) per the EWC spec */
+
+#define EWC_PARAMS_RX_FACTOR_MASK      0x03    /* ampdu rcv factor mask */
+#define EWC_PARAMS_DENSITY_MASK                0x1C    /* ampdu density mask */
+#define EWC_PARAMS_DENSITY_SHIFT       2       /* ampdu density shift */
+
+/* EWC/AMPDU specific define */
+#define AMPDU_MAX_MPDU_DENSITY 7       /* max mpdu density; in 1/8 usec units */
+#define AMPDU_MAX_RX_FACTOR    3       /* max rcv ampdu len (64kb) */
+#define AMPDU_RX_FACTOR_BASE   8*1024  /* ampdu factor base for rx len */
+#define AMPDU_DELIMITER_LEN    4       /* length of ampdu delimiter */
+
+struct ewc_add {
+       uint8   ctl_ch;                 /* control channel number */
+       uint8   byte1;                  /* ext ch,rec. ch. width, RIFS support */
+       uint16  opmode;                 /* operation mode */
+       uint16  misc_bits;              /* misc bits */
+       uint8   basic_mcs[MCSSET_LEN];  /* required MCS set */
+} PACKED;
+typedef struct ewc_add ewc_add_t;
+
+/* ADD IE: EWC 1.0 spec. simply stole a 802.11 IE, we use our prop. IE until this is resolved */
+/* the additional IE is primarily used to convey the current BSS configuration */
+struct ewc_add_ie {
+       uint8   id;             /* IE ID, 221, DOT11_MNG_PROPR_ID */
+       uint8   len;            /* IE length */
+       uint8   oui[3];         /* Proprietary OUI, BRCM_PROP_OUI */
+       uint8   type;           /* indicates what follows */
+       ewc_add_t add;
+} PACKED;
+typedef struct ewc_add_ie ewc_add_ie_t;
+
+#define EWC_ADD_IE_LEN (22+4)  
+#define EWC_ADD_IE_TYPE        52      
+
+/* byte1 defn's */
+#define EWC_EXT_CH_MASK                0x03    /* extension channel mask */
+#define EWC_EXT_CH_UPPER       0x01    /* ext. ch. on upper sb */
+#define EWC_EXT_CH_LOWER       0x03    /* ext. ch. on lower sb */
+#define EWC_EXT_CH_NONE                0x00    /* extension channel mask */
+#define EWC_BW_ANY             0x04    /* set, STA can use 20 or 40MHz */
+#define EWC_RIFS_PERMITTED             0x08    /* RIFS allowed */
+
+/* opmode defn's */
+#define EWC_OPMODE_MASK                0x0003  /* protection mode mask */
+#define EWC_OPMODE_PURE                0x0000  /* protection mode PURE */
+#define EWC_OPMODE_HT20IN40    0x0002  /* protection mode 20MHz HT in 40MHz BSS */
+#define EWC_OPMODE_MIXED       0x0003  /* protection mode Mixed Mode */
+#define EWC_NONGF_PRESENT      0x0004  /* protection mode non-GF */
+
+/* misc_bites defn's */
+#define EWC_BASIC_STBC_MCS     0x007f  /* basic STBC MCS */
+#define EWC_DUAL_STBC_PROT     0x0080  /* Dual STBC Protection */
+#define EWC_SECOND_BCN         0x0100  /* Secondary beacon support */
+#define EWC_LSIG_TXOP          0x0200  /* L-SIG TXOP Protection full support */
+#define EWC_PCO_ACTIVE         0x0400  /* PCO active */
+#define EWC_PCO_PHASE          0x0800  /* PCO phase */
+
+/* Macros for opmode */
+#define EWC_MIXEDMODE_PRESENT(add) ((ltoh16_ua(&add.opmode) & EWC_OPMODE_MASK) \
+                                  == EWC_OPMODE_MIXED) /* mixed mode present */
+#define EWC_HT20_PRESENT(add)  ((ltoh16_ua(&add.opmode) & EWC_OPMODE_MASK) \
+                               == EWC_OPMODE_HT20IN40) /* 20MHz HT present */
+#define EWC_USE_PROTECTION(add) (EWC_HT20_PRESENT((add)) || \
+                               EWC_MIXEDMODE_PRESENT((add)))   /* use protection */
+
+/* Vendor IE structure */
+struct vndr_ie {
+       uchar id;
+       uchar len;
+       uchar oui [3];
+       uchar data [1];         /* Variable size data */
+}PACKED;
+typedef struct vndr_ie vndr_ie_t;
+
+#define VNDR_IE_HDR_LEN                2       /* id + len field */
+#define VNDR_IE_MIN_LEN                3       /* size of the oui field */
+#define VNDR_IE_MAX_LEN                256     /* verdor IE max length */
 
 /* WPA definitions */
-#define WPA_VERSION            1
-#define WPA_OUI                        "\x00\x50\xF2"
+#define WPA_VERSION            1       /* WPA version */
+#define WPA_OUI                        "\x00\x50\xF2"  /* WPA OUI */
 
-#define WPA_OUI_LEN    3
+#define WPA2_VERSION           1       /* WPA2 version */
+#define WPA2_VERSION_LEN       2       /* WAP2 version length */
+#define WPA2_OUI               "\x00\x0F\xAC"  /* WPA2 OUI */
 
-/* WPA authentication modes */
-#define WPA_AUTH_NONE          0       /* None */
-#define WPA_AUTH_UNSPECIFIED   1       /* Unspecified authentication over 802.1X: default for WPA */
-#define WPA_AUTH_PSK           2       /* Pre-shared Key over 802.1X */
-#define WPA_AUTH_DISABLED      255     /* Legacy (i.e., non-WPA) */
-                                
-#define IS_WPA_AUTH(auth)      ((auth) == WPA_AUTH_NONE || \
-                                (auth) == WPA_AUTH_UNSPECIFIED || \
-                                (auth) == WPA_AUTH_PSK)
+#define WPA_OUI_LEN    3       /* WPA OUI length */
 
+/* RSN authenticated key managment suite */
+#define RSN_AKM_NONE           0       /* None (IBSS) */
+#define RSN_AKM_UNSPECIFIED    1       /* Over 802.1x */
+#define RSN_AKM_PSK            2       /* Pre-shared Key */
 
 /* Key related defines */
 #define DOT11_MAX_DEFAULT_KEYS 4       /* number of default keys */
@@ -840,8 +1246,8 @@ typedef    struct brcm_ie brcm_ie_t;
 #define TKIP_KEY_SIZE          32      /* size of any TKIP key */
 #define TKIP_MIC_AUTH_TX       16      /* offset to Authenticator MIC TX key */
 #define TKIP_MIC_AUTH_RX       24      /* offset to Authenticator MIC RX key */
-#define TKIP_MIC_SUP_RX                16      /* offset to Supplicant MIC RX key */
-#define TKIP_MIC_SUP_TX                24      /* offset to Supplicant MIC TX key */
+#define TKIP_MIC_SUP_RX                TKIP_MIC_AUTH_TX        /* offset to Supplicant MIC RX key */
+#define TKIP_MIC_SUP_TX                TKIP_MIC_AUTH_RX        /* offset to Supplicant MIC TX key */
 #define AES_KEY_SIZE           16      /* size of AES key */
 
 #undef PACKED
diff --git a/package/wlcompat/src/include/proto/bcmeth.h b/package/wlcompat/src/include/proto/bcmeth.h
new file mode 100644 (file)
index 0000000..7b32953
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Broadcom Ethernettype  protocol definitions
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: bcmeth.h,v 1.1.1.4 2006/02/27 03:43:16 honor Exp $
+ */
+
+/*
+ * Broadcom Ethernet protocol defines
+ */
+
+#ifndef _BCMETH_H_
+#define _BCMETH_H_
+
+/* enable structure packing */
+#if defined(__GNUC__)
+#define        PACKED  __attribute__((packed))
+#else
+#pragma pack(1)
+#define        PACKED
+#endif
+
+/* ETHER_TYPE_BRCM is defined in ethernet.h */
+
+/*
+ * Following the 2byte BRCM ether_type is a 16bit BRCM subtype field
+ * in one of two formats: (only subtypes 32768-65535 are in use now)
+ *
+ * subtypes 0-32767:
+ *     8 bit subtype (0-127)
+ *     8 bit length in bytes (0-255)
+ *
+ * subtypes 32768-65535:
+ *     16 bit big-endian subtype
+ *     16 bit big-endian length in bytes (0-65535)
+ *
+ * length is the number of additional bytes beyond the 4 or 6 byte header
+ *
+ * Reserved values:
+ * 0 reserved
+ * 5-15 reserved for iLine protocol assignments
+ * 17-126 reserved, assignable
+ * 127 reserved
+ * 32768 reserved
+ * 32769-65534 reserved, assignable
+ * 65535 reserved
+ */
+
+/* 
+ * While adding the subtypes and their specific processing code make sure
+ * bcmeth_bcm_hdr_t is the first data structure in the user specific data structure definition
+ */
+
+#define        BCMILCP_SUBTYPE_RATE            1
+#define        BCMILCP_SUBTYPE_LINK            2
+#define        BCMILCP_SUBTYPE_CSA             3
+#define        BCMILCP_SUBTYPE_LARQ            4
+#define BCMILCP_SUBTYPE_VENDOR         5
+#define        BCMILCP_SUBTYPE_FLH             17
+
+#define BCMILCP_SUBTYPE_VENDOR_LONG    32769
+#define BCMILCP_SUBTYPE_CERT           32770
+#define BCMILCP_SUBTYPE_SES            32771
+
+
+#define BCMILCP_BCM_SUBTYPE_RESERVED   0
+#define BCMILCP_BCM_SUBTYPE_EVENT              1
+#define BCMILCP_BCM_SUBTYPE_SES                        2
+/*
+ * The EAPOL type is not used anymore. Instead EAPOL messages are now embedded
+ * within BCMILCP_BCM_SUBTYPE_EVENT type messages
+ */
+/* #define BCMILCP_BCM_SUBTYPE_EAPOL           3 */
+
+#define BCMILCP_BCM_SUBTYPEHDR_MINLENGTH       8
+#define BCMILCP_BCM_SUBTYPEHDR_VERSION         0
+
+/* These fields are stored in network order */
+typedef  struct bcmeth_hdr
+{
+       uint16  subtype;        /* Vendor specific..32769 */
+       uint16  length;
+       uint8   version;        /* Version is 0 */
+       uint8   oui[3];         /* Broadcom OUI */
+       /* user specific Data */
+       uint16  usr_subtype;
+} PACKED bcmeth_hdr_t;
+
+#undef PACKED
+#if !defined(__GNUC__)
+#pragma pack()
+#endif
+
+#endif /*  _BCMETH_H_ */
diff --git a/package/wlcompat/src/include/proto/bcmevent.h b/package/wlcompat/src/include/proto/bcmevent.h
new file mode 100644 (file)
index 0000000..d922a5d
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Broadcom Event  protocol definitions
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ *
+ * Dependencies: proto/bcmeth.h
+ *
+ * $Id: bcmevent.h,v 1.1.1.3 2006/02/27 03:43:16 honor Exp $
+ *
+ */
+
+/*
+ * Broadcom Ethernet Events protocol defines
+ *
+ */
+
+#ifndef _BCMEVENT_H_
+#define _BCMEVENT_H_
+
+/* enable structure packing */
+#if defined(__GNUC__)
+#define        PACKED  __attribute__((packed))
+#else
+#pragma pack(1)
+#define        PACKED
+#endif /* defined(__GNUC__) */
+
+#define BCM_EVENT_MSG_VERSION          1       /* wl_event_msg_t struct version */
+#define BCM_MSG_IFNAME_MAX             16      /* max length of interface name */
+
+/* flags */
+#define WLC_EVENT_MSG_LINK             0x01    /* link is up */
+#define WLC_EVENT_MSG_FLUSHTXQ         0x02    /* flush tx queue on MIC error */
+#define WLC_EVENT_MSG_GROUP            0x04    /* group MIC error */
+
+/* theses fields are stored in network order */
+typedef struct
+{
+       uint16  version;
+       uint16  flags;                  /* see flags below */
+       uint32  event_type;             /* Message (see below) */
+       uint32  status;                 /* Status code (see below) */
+       uint32  reason;                 /* Reason code (if applicable) */
+       uint32  auth_type;              /* WLC_E_AUTH */
+       uint32  datalen;                /* data buf */
+       struct ether_addr       addr;   /* Station address (if applicable) */
+       char    ifname[BCM_MSG_IFNAME_MAX]; /* name of the packet incoming interface */
+} PACKED wl_event_msg_t;
+
+/* used by driver msgs */
+typedef struct bcm_event {
+       struct ether_header eth;
+       bcmeth_hdr_t            bcm_hdr;
+       wl_event_msg_t          event;
+       /* data portion follows */
+} PACKED bcm_event_t;
+
+#define BCM_MSG_LEN    (sizeof(bcm_event_t) - sizeof(bcmeth_hdr_t) - sizeof(struct ether_header))
+
+/* Event messages */
+#define WLC_E_SET_SSID         0       /* indicates status of set SSID */
+#define WLC_E_JOIN             1       /* differentiates join IBSS from found (WLC_E_START) IBSS */
+#define WLC_E_START            2       /* STA founded an IBSS or AP started a BSS */
+#define WLC_E_AUTH             3       /* 802.11 AUTH request */
+#define WLC_E_AUTH_IND         4       /* 802.11 AUTH indication */
+#define WLC_E_DEAUTH           5       /* 802.11 DEAUTH request */
+#define WLC_E_DEAUTH_IND       6       /* 802.11 DEAUTH indication */
+#define WLC_E_ASSOC            7       /* 802.11 ASSOC request */
+#define WLC_E_ASSOC_IND                8       /* 802.11 ASSOC indication */
+#define WLC_E_REASSOC          9       /* 802.11 REASSOC request */
+#define WLC_E_REASSOC_IND      10      /* 802.11 REASSOC indication */
+#define WLC_E_DISASSOC         11      /* 802.11 DISASSOC request */
+#define WLC_E_DISASSOC_IND     12      /* 802.11 DISASSOC indication */
+#define WLC_E_QUIET_START      13      /* 802.11h Quiet period started */
+#define WLC_E_QUIET_END                14      /* 802.11h Quiet period ended */
+#define WLC_E_BEACON_RX                15      /* BEACONS received/lost indication */
+#define WLC_E_LINK             16      /* generic link indication */
+#define WLC_E_MIC_ERROR                17      /* TKIP MIC error occurred */
+#define WLC_E_NDIS_LINK                18      /* NDIS style link indication */
+#define WLC_E_ROAM             19      /* roam attempt occurred: indicate status & reason */
+#define WLC_E_TXFAIL           20      /* change in dot11FailedCount (txfail) */
+#define WLC_E_PMKID_CACHE      21      /* WPA2 pmkid cache indication */
+#define WLC_E_RETROGRADE_TSF   22      /* current AP's TSF value went backward */
+#define WLC_E_PRUNE            23      /* AP was pruned from join list for reason */
+#define WLC_E_AUTOAUTH         24      /* report AutoAuth table entry match for join attempt */
+#define WLC_E_EAPOL_MSG                25      /* Event encapsulating an EAPOL message */
+#define WLC_E_SCAN_COMPLETE    26      /* Scan results are ready or scan was aborted */
+#define WLC_E_ADDTS_IND                27      /* indicate to host addts fail/success */
+#define WLC_E_DELTS_IND                28      /* indicate to host delts fail/success */
+#define WLC_E_BCNSENT_IND      29      /* indicate to host of beacon transmit */
+#define WLC_E_BCNRX_MSG                30      /* Send the received beacon up to the host */
+#define WLC_E_LAST             31      /* highest val + 1 for range checking */
+
+/* Event status codes */
+#define WLC_E_STATUS_SUCCESS           0       /* operation was successful */
+#define WLC_E_STATUS_FAIL              1       /* operation failed */
+#define WLC_E_STATUS_TIMEOUT           2       /* operation timed out */
+#define WLC_E_STATUS_NO_NETWORKS       3       /* failed due to no matching network found */
+#define WLC_E_STATUS_ABORT             4       /* operation was aborted */
+#define WLC_E_STATUS_NO_ACK            5       /* protocol failure: packet not ack'd */
+#define WLC_E_STATUS_UNSOLICITED       6       /* AUTH or ASSOC packet was unsolicited */
+#define WLC_E_STATUS_ATTEMPT           7       /* attempt to assoc to an auto auth configuration */
+
+/* roam reason codes */
+#define WLC_E_REASON_INITIAL_ASSOC     0       /* initial assoc */
+#define WLC_E_REASON_LOW_RSSI          1       /* roamed due to low RSSI */
+#define WLC_E_REASON_DEAUTH            2       /* roamed due to DEAUTH indication */
+#define WLC_E_REASON_DISASSOC          3       /* roamed due to DISASSOC indication */
+#define WLC_E_REASON_BCNS_LOST         4       /* roamed due to lost beacons */
+#define WLC_E_REASON_FAST_ROAM_FAILED  5       /* roamed due to fast roam failure */
+#define WLC_E_REASON_DIRECTED_ROAM     6       /* roamed due to request by AP */
+#define WLC_E_REASON_TSPEC_REJECTED    7       /* roamed due to TSPEC rejection */
+#define WLC_E_REASON_BETTER_AP         8       /* roamed due to finding better AP */
+
+/* prune reason codes */
+#define WLC_E_PRUNE_ENCR_MISMATCH      1       /* ecryption mismatch */
+#define WLC_E_PRUNE_BCAST_BSSID                2       /* AP uses a broadcast BSSID */
+#define WLC_E_PRUNE_MAC_DENY           3       /* STA's MAC addr is in AP's MAC deny list */
+#define WLC_E_PRUNE_MAC_NA             4       /* STA's MAC addr is not in AP's MAC allow list */
+#define WLC_E_PRUNE_REG_PASSV          5       /* AP not allowed due to regulatory restriction */
+#define WLC_E_PRUNE_SPCT_MGMT          6       /* AP does not support STA locale spectrum mgmt */
+#define WLC_E_PRUNE_RADAR              7       /* AP is on a radar channel of STA locale */
+#define WLC_E_RSN_MISMATCH             8       /* STA does not support AP's RSN */
+#define WLC_E_PRUNE_NO_COMMON_RATES    9       /* No rates in common with AP */
+#define WLC_E_PRUNE_BASIC_RATES                10      /* STA does not support all basic rates of BSS */
+#define WLC_E_PRUNE_CCXFAST_PREVAP     11      /* CCX FAST ROAM: prune previous AP */
+#define WLC_E_PRUNE_CIPHER_NA          12      /* BSS's cipher not supported */
+#define WLC_E_PRUNE_KNOWN_STA          13      /* AP is already known to us as a STA */
+#define WLC_E_PRUNE_CCXFAST_DROAM      14      /* CCX FAST ROAM: prune unqulified AP */
+#define WLC_E_PRUNE_WDS_PEER           15      /* AP is already known to us as a WDS peer */
+#define WLC_E_PRUNE_QBSS_LOAD          16      /* QBSS LOAD - AAC is too low */
+#define WLC_E_PRUNE_HOME_AP            17      /* prune home AP */
+
+/* WLC_SET_CALLBACK data type */
+typedef struct wlc_event_cb {
+       void (*fn)(void *, bcm_event_t *);      /* Callback function */
+       void *context;                          /* Passed to callback function */
+} wlc_event_cb_t;
+
+#undef PACKED
+#if !defined(__GNUC__)
+#pragma pack()
+#endif /* PACKED */
+
+#endif /* _BCMEVENT_H_ */
index 173464af6395076c0010639cf9905c9f436649f2..38313ce520169d6105265fbb8c4c7f272478abd1 100644 (file)
@@ -1,14 +1,16 @@
-/*******************************************************************************
- * $Id$
- * Copyright 2004, Broadcom Corporation      
- * All Rights Reserved.      
- *       
- * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY      
- * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM      
- * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS      
- * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.      
+/*
  * From FreeBSD 2.2.7: Fundamental constants relating to ethernet.
- ******************************************************************************/
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id$
+ */
 
 #ifndef _NET_ETHERNET_H_           /* use native BSD ethernet.h when available */
 #define _NET_ETHERNET_H_
 #include "typedefs.h"
 #endif
 
+/* enable structure packing */
 #if defined(__GNUC__)
 #define        PACKED  __attribute__((packed))
 #else
+#pragma pack(1)
 #define        PACKED
 #endif
 
 /*
  * The number of bytes in an ethernet (MAC) address.
  */
-#ifndef ETHER_ADDR_LEN
 #define        ETHER_ADDR_LEN          6
-#endif
 
 /*
  * The number of bytes in the type field.
  */
-#ifndef        ETHER_TYPE_LEN
 #define        ETHER_TYPE_LEN          2
-#endif
 
 /*
  * The number of bytes in the trailing CRC field.
  */
-#ifndef        ETHER_CRC_LEN
 #define        ETHER_CRC_LEN           4
-#endif
 
 /*
  * The length of the combined header.
  */
-#ifndef        ETHER_HDR_LEN
 #define        ETHER_HDR_LEN           (ETHER_ADDR_LEN*2+ETHER_TYPE_LEN)
-#endif
 
 /*
  * The minimum packet length.
  */
-#ifndef ETHER_MIN_LEN
 #define        ETHER_MIN_LEN           64
-#endif
 
 /*
  * The minimum packet user data length.
  */
-#ifndef ETHER_MIN_DATA
 #define        ETHER_MIN_DATA          46
-#endif
 
 /*
  * The maximum packet length.
  */
-#ifndef ETHER_MAX_LEN
 #define        ETHER_MAX_LEN           1518
-#endif
 
 /*
  * The maximum packet user data length.
  */
 #define        ETHER_MAX_DATA          1500
 
-/*
- * Used to uniquely identify a 802.1q VLAN-tagged header.
- */
-#define        VLAN_TAG                        0x8100
-
-/*
- * Located after dest & src address in ether header.
- */
-#define VLAN_FIELDS_OFFSET             (ETHER_ADDR_LEN * 2)
-
-/*
- * 4 bytes of vlan field info.
- */
-#define VLAN_FIELDS_SIZE               4
-
-/* location of bits in 16-bit vlan fields */
-#define VLAN_PRI_SHIFT         13      /* user priority */
-#define VLAN_CFI_SHIFT         12      /* canonical format indicator bit */
-
-/* 3 bits of priority */
-#define VLAN_PRI_MASK                  7
-/* 12 bits of vlan identfier (VID) */
-#define VLAN_VID_MASK          0xFFF   /* VLAN identifier (VID) field */
-
-struct  vlan_tags {
-       uint16  tag_type;       /* 0x8100 for VLAN */
-       uint16  tag_control;    /* prio | cfi | vid */
-} PACKED ;
-
-/* 802.1X ethertype */
-
+/* ether types */
 #define        ETHER_TYPE_IP           0x0800          /* IP */
+#define ETHER_TYPE_ARP         0x0806          /* ARP */
+#define ETHER_TYPE_8021Q       0x8100          /* 802.1Q */
 #define        ETHER_TYPE_BRCM         0x886c          /* Broadcom Corp. */
 #define        ETHER_TYPE_802_1X       0x888e          /* 802.1x */
+#ifdef BCMWPA2
+#define        ETHER_TYPE_802_1X_PREAUTH 0x88c7        /* 802.1x preauthentication */
+#endif
 
-#define        ETHER_BRCM_SUBTYPE_LEN  4               /* Broadcom 4byte subtype follows ethertype */
+/* Broadcom subtype follows ethertype;  First 2 bytes are reserved; Next 2 are subtype; */
+#define        ETHER_BRCM_SUBTYPE_LEN  4               /* Broadcom 4 byte subtype */
 #define        ETHER_BRCM_CRAM         0x1             /* Broadcom subtype cram protocol */
 
+/* ether header */
+#define ETHER_DEST_OFFSET      0               /* dest address offset */
+#define ETHER_SRC_OFFSET       6               /* src address offset */
+#define ETHER_TYPE_OFFSET      12              /* ether type offset */
+
 /*
  * A macro to validate a length with
  */
 #define        ETHER_IS_VALID_LEN(foo) \
        ((foo) >= ETHER_MIN_LEN && (foo) <= ETHER_MAX_LEN)
 
-#ifndef __NET_ETHERNET_H
+
 #ifndef __INCif_etherh     /* Quick and ugly hack for VxWorks */
 /*
  * Structure of a 10Mb/s Ethernet header.
@@ -130,16 +101,21 @@ struct    ether_header {
        uint8   ether_dhost[ETHER_ADDR_LEN];
        uint8   ether_shost[ETHER_ADDR_LEN];
        uint16  ether_type;
-} PACKED ;
+} PACKED;
 
 /*
  * Structure of a 48-bit Ethernet address.
  */
 struct ether_addr {
        uint8 octet[ETHER_ADDR_LEN];
-} PACKED ;
-#endif
-#endif
+} PACKED;
+#endif /* !__INCif_etherh Quick and ugly hack for VxWorks */
+
+/*
+ * Takes a pointer, sets locally admininistered
+ * address bit in the 48-bit Ethernet address.
+ */
+#define ETHER_SET_LOCALADDR(ea)        (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] | 2))
 
 /*
  * Takes a pointer, returns true if a 48-bit multicast address
@@ -147,6 +123,18 @@ struct     ether_addr {
  */
 #define ETHER_ISMULTI(ea) (((uint8 *)(ea))[0] & 1)
 
+
+/* compare two ethernet addresses - assumes the pointers can be referenced as shorts */
+#define        ether_cmp(a, b) (!(((short*)a)[0] == ((short*)b)[0]) | \
+                        !(((short*)a)[1] == ((short*)b)[1]) | \
+                        !(((short*)a)[2] == ((short*)b)[2]))
+
+/* copy an ethernet address - assumes the pointers can be referenced as shorts */
+#define        ether_copy(s, d) { \
+               ((short*)d)[0] = ((short*)s)[0]; \
+               ((short*)d)[1] = ((short*)s)[1]; \
+               ((short*)d)[2] = ((short*)s)[2]; }
+
 /*
  * Takes a pointer, returns true if a 48-bit broadcast (all ones)
  */
@@ -169,11 +157,9 @@ static const struct ether_addr ether_bcast = {{255, 255, 255, 255, 255, 255}};
                            ((uint8 *)(ea))[4] |                \
                            ((uint8 *)(ea))[5]) == 0)
 
-/* Differentiated Services Codepoint - lower 6 bits of tos in iphdr */
-#define        DSCP_PRI_MASK           0x3F            /* bits 0-6 */
-#define        DSCP_WME_PRI_MASK       0x38            /* bits 3-6 */
-#define        DSCP_WME_PRI_SHIFT      3
-
 #undef PACKED
+#if !defined(__GNUC__)
+#pragma pack()
+#endif
 
 #endif /* _NET_ETHERNET_H_ */
diff --git a/package/wlcompat/src/include/proto/wpa.h b/package/wlcompat/src/include/proto/wpa.h
new file mode 100644 (file)
index 0000000..dd35dbe
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Fundamental types and constants relating to WPA
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: wpa.h,v 1.1.1.4 2006/02/27 03:43:16 honor Exp $
+ */
+
+#ifndef _proto_wpa_h_
+#define _proto_wpa_h_
+
+#include <typedefs.h>
+#include <proto/ethernet.h>
+
+/* enable structure packing */
+#if defined(__GNUC__)
+#define        PACKED  __attribute__((packed))
+#else
+#pragma pack(1)
+#define        PACKED
+#endif
+
+/* Reason Codes */
+
+/* 10 and 11 are from TGh. */
+#define DOT11_RC_BAD_PC                        10      /* Unacceptable power capability element */
+#define DOT11_RC_BAD_CHANNELS          11      /* Unacceptable supported channels element */
+/* 12 is unused */
+/* 13 through 23 taken from P802.11i/D3.0, November 2002 */
+#define DOT11_RC_INVALID_WPA_IE                13      /* Invalid info. element */
+#define DOT11_RC_MIC_FAILURE           14      /* Michael failure */
+#define DOT11_RC_4WH_TIMEOUT           15      /* 4-way handshake timeout */
+#define DOT11_RC_GTK_UPDATE_TIMEOUT    16      /* Group key update timeout */
+#define DOT11_RC_WPA_IE_MISMATCH       17      /* WPA IE in 4-way handshake differs from
+                                                * (re-)assoc. request/probe response
+                                                */
+#define DOT11_RC_INVALID_MC_CIPHER     18      /* Invalid multicast cipher */
+#define DOT11_RC_INVALID_UC_CIPHER     19      /* Invalid unicast cipher */
+#define DOT11_RC_INVALID_AKMP          20      /* Invalid authenticated key management protocol */
+#define DOT11_RC_BAD_WPA_VERSION       21      /* Unsupported WPA version */
+#define DOT11_RC_INVALID_WPA_CAP       22      /* Invalid WPA IE capabilities */
+#define DOT11_RC_8021X_AUTH_FAIL       23      /* 802.1X authentication failure */
+
+#define WPA2_PMKID_LEN 16
+
+/* WPA IE fixed portion */
+typedef struct
+{
+       uint8 tag;      /* TAG */
+       uint8 length;   /* TAG length */
+       uint8 oui[3];   /* IE OUI */
+       uint8 oui_type; /* OUI type */
+       struct {
+               uint8 low;
+               uint8 high;
+       } PACKED version;       /* IE version */
+} PACKED wpa_ie_fixed_t;
+#define WPA_IE_OUITYPE_LEN     4
+#define WPA_IE_FIXED_LEN       8
+#define WPA_IE_TAG_FIXED_LEN   6
+
+#ifdef BCMWPA2
+typedef struct {
+       uint8 tag;      /* TAG */
+       uint8 length;   /* TAG length */
+       struct {
+               uint8 low;
+               uint8 high;
+       } PACKED version;       /* IE version */
+} PACKED wpa_rsn_ie_fixed_t;
+#define WPA_RSN_IE_FIXED_LEN   4
+#define WPA_RSN_IE_TAG_FIXED_LEN       2
+typedef uint8 wpa_pmkid_t[WPA2_PMKID_LEN];
+#endif
+
+/* WPA suite/multicast suite */
+typedef struct
+{
+       uint8 oui[3];
+       uint8 type;
+} PACKED wpa_suite_t, wpa_suite_mcast_t;
+#define WPA_SUITE_LEN  4
+
+/* WPA unicast suite list/key management suite list */
+typedef struct
+{
+       struct {
+               uint8 low;
+               uint8 high;
+       } PACKED count;
+       wpa_suite_t list[1];
+} PACKED wpa_suite_ucast_t, wpa_suite_auth_key_mgmt_t;
+#define WPA_IE_SUITE_COUNT_LEN 2
+#ifdef BCMWPA2
+typedef struct
+{
+       struct {
+               uint8 low;
+               uint8 high;
+       } PACKED count;
+       wpa_pmkid_t list[1];
+} PACKED wpa_pmkid_list_t;
+#endif
+
+/* WPA cipher suites */
+#define WPA_CIPHER_NONE                0       /* None */
+#define WPA_CIPHER_WEP_40      1       /* WEP (40-bit) */
+#define WPA_CIPHER_TKIP                2       /* TKIP: default for WPA */
+#define WPA_CIPHER_AES_OCB     3       /* AES (OCB) */
+#define WPA_CIPHER_AES_CCM     4       /* AES (CCM) */
+#define WPA_CIPHER_WEP_104     5       /* WEP (104-bit) */
+
+#define IS_WPA_CIPHER(cipher)  ((cipher) == WPA_CIPHER_NONE || \
+                                (cipher) == WPA_CIPHER_WEP_40 || \
+                                (cipher) == WPA_CIPHER_WEP_104 || \
+                                (cipher) == WPA_CIPHER_TKIP || \
+                                (cipher) == WPA_CIPHER_AES_OCB || \
+                                (cipher) == WPA_CIPHER_AES_CCM)
+
+/* WPA TKIP countermeasures parameters */
+#define WPA_TKIP_CM_DETECT     60      /* multiple MIC failure window (seconds) */
+#define WPA_TKIP_CM_BLOCK      60      /* countermeasures active window (seconds) */
+
+/* WPA capabilities defined in 802.11i */
+#define WPA_CAP_4_REPLAY_CNTRS         2
+#define WPA_CAP_16_REPLAY_CNTRS                3
+#define WPA_CAP_REPLAY_CNTR_SHIFT      2
+#define WPA_CAP_REPLAY_CNTR_MASK       0x000c
+
+/* WPA Specific defines */
+#define WPA_CAP_LEN    2       /* Length of RSN capabilities in RSN IE (2 octets) */
+
+#ifdef BCMWPA2
+#define        WPA_CAP_WPA2_PREAUTH            1
+#endif /* BCMWPA2 */
+
+#undef PACKED
+#if !defined(__GNUC__)
+#pragma pack()
+#endif
+
+#endif /* _proto_wpa_h_ */
diff --git a/package/wlcompat/src/include/shutils.h b/package/wlcompat/src/include/shutils.h
deleted file mode 100644 (file)
index 783ee9e..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Shell-like utility functions
- *
- * Copyright 2004, Broadcom Corporation
- * All Rights Reserved.
- * 
- * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
- * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
- * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
- *
- * $Id$
- */
-
-#ifndef _shutils_h_
-#define _shutils_h_
-#include <string.h>
-/*
- * Reads file and returns contents
- * @param      fd      file descriptor
- * @return     contents of file or NULL if an error occurred
- */
-extern char * fd2str(int fd);
-
-/*
- * Reads file and returns contents
- * @param      path    path to file
- * @return     contents of file or NULL if an error occurred
- */
-extern char * file2str(const char *path);
-
-/* 
- * Waits for a file descriptor to become available for reading or unblocked signal
- * @param      fd      file descriptor
- * @param      timeout seconds to wait before timing out or 0 for no timeout
- * @return     1 if descriptor changed status or 0 if timed out or -1 on error
- */
-extern int waitfor(int fd, int timeout);
-
-/* 
- * Concatenates NULL-terminated list of arguments into a single
- * commmand and executes it
- * @param      argv    argument list
- * @param      path    NULL, ">output", or ">>output"
- * @param      timeout seconds to wait before timing out or 0 for no timeout
- * @param      ppid    NULL to wait for child termination or pointer to pid
- * @return     return value of executed command or errno
- */
-extern int _eval(char *const argv[], char *path, int timeout, pid_t *ppid);
-
-/* 
- * Concatenates NULL-terminated list of arguments into a single
- * commmand and executes it
- * @param      argv    argument list
- * @return     stdout of executed command or NULL if an error occurred
- */
-extern char * _backtick(char *const argv[]);
-
-/* 
- * Kills process whose PID is stored in plaintext in pidfile
- * @param      pidfile PID file
- * @return     0 on success and errno on failure
- */
-extern int kill_pidfile(char *pidfile);
-
-/*
- * fread() with automatic retry on syscall interrupt
- * @param      ptr     location to store to
- * @param      size    size of each element of data
- * @param      nmemb   number of elements
- * @param      stream  file stream
- * @return     number of items successfully read
- */
-extern int safe_fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
-
-/*
- * fwrite() with automatic retry on syscall interrupt
- * @param      ptr     location to read from
- * @param      size    size of each element of data
- * @param      nmemb   number of elements
- * @param      stream  file stream
- * @return     number of items successfully written
- */
-extern int safe_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
-
-/*
- * Convert Ethernet address string representation to binary data
- * @param      a       string in xx:xx:xx:xx:xx:xx notation
- * @param      e       binary data
- * @return     TRUE if conversion was successful and FALSE otherwise
- */
-extern int ether_atoe(const char *a, unsigned char *e);
-
-/*
- * Convert Ethernet address binary data to string representation
- * @param      e       binary data
- * @param      a       string in xx:xx:xx:xx:xx:xx notation
- * @return     a
- */
-extern char * ether_etoa(const unsigned char *e, char *a);
-
-/*
- * Concatenate two strings together into a caller supplied buffer
- * @param      s1      first string
- * @param      s2      second string
- * @param      buf     buffer large enough to hold both strings
- * @return     buf
- */
-static inline char * strcat_r(const char *s1, const char *s2, char *buf)
-{
-       strcpy(buf, s1);
-       strcat(buf, s2);
-       return buf;
-}      
-
-/* Check for a blank character; that is, a space or a tab */
-#define isblank(c) ((c) == ' ' || (c) == '\t')
-
-/* Strip trailing CR/NL from string <s> */
-#define chomp(s) ({ \
-       char *c = (s) + strlen((s)) - 1; \
-       while ((c > (s)) && (*c == '\n' || *c == '\r' || *c == ' ')) \
-               *c-- = '\0'; \
-       s; \
-})
-
-/* Simple version of _backtick() */
-#define backtick(cmd, args...) ({ \
-       char *argv[] = { cmd, ## args, NULL }; \
-       _backtick(argv); \
-})
-
-/* Simple version of _eval() (no timeout and wait for child termination) */
-#define eval(cmd, args...) ({ \
-       char *argv[] = { cmd, ## args, NULL }; \
-       _eval(argv, ">/dev/console", 0, NULL); \
-})
-
-/* Copy each token in wordlist delimited by space into word */
-#define foreach(word, wordlist, next) \
-       for (next = &wordlist[strspn(wordlist, " ")], \
-            strncpy(word, next, sizeof(word)), \
-            word[strcspn(word, " ")] = '\0', \
-            word[sizeof(word) - 1] = '\0', \
-            next = strchr(next, ' '); \
-            strlen(word); \
-            next = next ? &next[strspn(next, " ")] : "", \
-            strncpy(word, next, sizeof(word)), \
-            word[strcspn(word, " ")] = '\0', \
-            word[sizeof(word) - 1] = '\0', \
-            next = strchr(next, ' '))
-
-/* Return NUL instead of NULL if undefined */
-#define safe_getenv(s) (getenv(s) ? : "")
-
-/* Print directly to the console */
-#define cprintf(fmt, args...) do { \
-       FILE *fp = fopen("/dev/console", "w"); \
-       if (fp) { \
-               fprintf(fp, fmt, ## args); \
-               fclose(fp); \
-       } \
-} while (0)
-
-/* Debug print */
-#ifdef DEBUG
-#define dprintf(fmt, args...) cprintf("%s: " fmt, __FUNCTION__, ## args)
-#else
-#define dprintf(fmt, args...)
-#endif
-
-#ifdef vxworks
-
-#include <inetLib.h>
-#define inet_aton(a, n) ((inet_aton((a), (n)) == ERROR) ? 0 : 1)
-#define inet_ntoa(n) ({ char a[INET_ADDR_LEN]; inet_ntoa_b ((n), a); a; })
-
-#include <typedefs.h>
-#include <bcmutils.h>
-#define ether_atoe(a, e) bcm_ether_atoe((a), (e))
-#define ether_etoa(e, a) bcm_ether_ntoa((e), (a))
-
-/* These declarations are not available where you would expect them */
-extern int vsnprintf (char *, size_t, const char *, va_list);
-extern int snprintf(char *str, size_t count, const char *fmt, ...);
-extern char *strdup(const char *);
-extern char *strsep(char **stringp, char *delim);
-extern int strcasecmp(const char *s1, const char *s2); 
-extern int strncasecmp(const char *s1, const char *s2, size_t n); 
-
-/* Neither are socket() and connect() */
-#include <sockLib.h>
-
-#ifdef DEBUG
-#undef dprintf
-#define dprintf printf
-#endif
-#endif
-
-#endif /* _shutils_h_ */
index 6b0c25e042487f5373b2b285cab556c8a807ce1f..574a1df74614b784e709cb4ec98636bd36bf4cf6 100644 (file)
@@ -1,45 +1,22 @@
 /*
- * Copyright 2004, Broadcom Corporation      
- * All Rights Reserved.      
- *       
- * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY      
- * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM      
- * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS      
- * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.      
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
  * $Id$
  */
 
 #ifndef _TYPEDEFS_H_
 #define _TYPEDEFS_H_
 
-
-/* Define 'SITE_TYPEDEFS' in the compile to include a site specific
- * typedef file "site_typedefs.h".
- *
- * If 'SITE_TYPEDEFS' is not defined, then the "Inferred Typedefs"
- * section of this file makes inferences about the compile environment
- * based on defined symbols and possibly compiler pragmas.
+/*
+ * Inferred Typedefs
  *
- * Following these two sections is the "Default Typedefs"
- * section. This section is only prcessed if 'USE_TYPEDEF_DEFAULTS' is
- * defined. This section has a default set of typedefs and a few
- * proprocessor symbols (TRUE, FALSE, NULL, ...).
  */
 
-#ifdef SITE_TYPEDEFS
-
-/*******************************************************************************
- * Site Specific Typedefs
- *******************************************************************************/
-
-#include "site_typedefs.h"
-
-#else
-
-/*******************************************************************************
- * Inferred Typedefs
- *******************************************************************************/
-
 /* Infer the compile environment based on preprocessor symbols and pramas.
  * Override type definitions as needed, and include configuration dependent
  * header files to define types.
 #define TRUE   true
 #endif
 
-#else  /* ! __cplusplus */
-
-/* for Windows build, define bool as a uchar instead of the default int */
-#if defined(_WIN32)
-
-#define TYPEDEF_BOOL
-typedef        unsigned char   bool;
+#endif /* __cplusplus */
 
-#endif /* _WIN32 */
-
-#endif /* ! __cplusplus */
-
-#ifdef _MSC_VER            /* Microsoft C */
-#define TYPEDEF_INT64
-#define TYPEDEF_UINT64
-typedef signed __int64 int64;
-typedef unsigned __int64 uint64;
-#endif
-
-#if defined(MACOSX) && defined(KERNEL)
-#define TYPEDEF_BOOL
+#if defined(_NEED_SIZE_T_)
+typedef long unsigned int size_t;
 #endif
 
-
-#if defined(linux)
 #define TYPEDEF_UINT
 #define TYPEDEF_USHORT
 #define TYPEDEF_ULONG
-#endif
-
-#if !defined(linux) && !defined(_WIN32) && !defined(PMON) && !defined(_CFE_)
-#define TYPEDEF_UINT
-#define TYPEDEF_USHORT
-#endif
 
 
 /* Do not support the (u)int64 types with strict ansi for GNU C */
@@ -97,57 +49,29 @@ typedef unsigned __int64 uint64;
 #define TYPEDEF_UINT64
 #endif
 
-/* ICL accepts unsigned 64 bit type only, and complains in ANSI mode
- * for singned or unsigned */
-#if defined(__ICL)
-
-#define TYPEDEF_INT64
-
-#if defined(__STDC__)
-#define TYPEDEF_UINT64
-#endif
-
-#endif /* __ICL */
-
-
-#if !defined(_WIN32) && !defined(PMON) && !defined(_CFE_)
-
 /* pick up ushort & uint from standard types.h */
 #if defined(linux) && defined(__KERNEL__)
-
 #include <linux/types.h>       /* sys/types.h and linux/types.h are oil and water */
-
 #else
-
-#include <sys/types.h> 
-
+#include <sys/types.h>
 #endif
 
-#endif /* !_WIN32 && !PMON && !_CFE_ */
-
-#if defined(MACOSX) && defined(KERNEL)
-#include <IOKit/IOTypes.h>
-#endif
-
-
 /* use the default typedefs in the next section of this file */
 #define USE_TYPEDEF_DEFAULTS
 
-#endif /* SITE_TYPEDEFS */
-
-
-/*******************************************************************************
+/*
  * Default Typedefs
- *******************************************************************************/
+ *
+ */
 
 #ifdef USE_TYPEDEF_DEFAULTS
 #undef USE_TYPEDEF_DEFAULTS
 
 #ifndef TYPEDEF_BOOL
-typedef        int     bool;
+typedef        /* @abstract@ */ unsigned char  bool;
 #endif
 
-/*----------------------- define uchar, ushort, uint, ulong ----------------*/
+/* define uchar, ushort, uint, ulong */
 
 #ifndef TYPEDEF_UCHAR
 typedef unsigned char  uchar;
@@ -165,7 +89,7 @@ typedef unsigned int uint;
 typedef unsigned long  ulong;
 #endif
 
-/*----------------------- define [u]int8/16/32/64 --------------------------*/
+/* define [u]int8/16/32/64, uintptr */
 
 #ifndef TYPEDEF_UINT8
 typedef unsigned char  uint8;
@@ -183,6 +107,10 @@ typedef unsigned int       uint32;
 typedef unsigned long long uint64;
 #endif
 
+#ifndef TYPEDEF_UINTPTR
+typedef unsigned int   uintptr;
+#endif
+
 #ifndef TYPEDEF_INT8
 typedef signed char    int8;
 #endif
@@ -199,7 +127,7 @@ typedef signed int  int32;
 typedef signed long long int64;
 #endif
 
-/*----------------------- define float32/64, float_t -----------------------*/
+/* define float32/64, float_t */
 
 #ifndef TYPEDEF_FLOAT32
 typedef float          float32;
@@ -225,14 +153,14 @@ typedef float64 float_t;
 
 #endif /* TYPEDEF_FLOAT_T */
 
-/*----------------------- define macro values -----------------------------*/
+/* define macro values */
 
 #ifndef FALSE
 #define FALSE  0
 #endif
 
 #ifndef TRUE
-#define TRUE   1
+#define TRUE   1  /* TRUE */
 #endif
 
 #ifndef NULL
@@ -244,13 +172,15 @@ typedef float64 float_t;
 #endif
 
 #ifndef ON
-#define        ON      1
+#define        ON      1  /* ON = 1 */
 #endif
 
-/*----------------------- define PTRSZ, INLINE ----------------------------*/
+#define        AUTO    (-1) /* Auto = -1 */
+
+/* define PTRSZ, INLINE */
 
 #ifndef PTRSZ
-#define        PTRSZ   sizeof (char*)
+#define        PTRSZ   sizeof(char*)
 #endif
 
 #ifndef INLINE
@@ -280,6 +210,7 @@ typedef float64 float_t;
 #undef TYPEDEF_UINT16
 #undef TYPEDEF_UINT32
 #undef TYPEDEF_UINT64
+#undef TYPEDEF_UINTPTR
 #undef TYPEDEF_INT8
 #undef TYPEDEF_INT16
 #undef TYPEDEF_INT32
@@ -290,4 +221,10 @@ typedef float64 float_t;
 
 #endif /* USE_TYPEDEF_DEFAULTS */
 
+/* 
+ * Including the bcmdefs.h here, to make sure everyone including typedefs.h 
+ * gets this automatically 
+*/
+#include <bcmdefs.h>
+
 #endif /* _TYPEDEFS_H_ */
diff --git a/package/wlcompat/src/include/utils.h b/package/wlcompat/src/include/utils.h
deleted file mode 100644 (file)
index b8d1cdb..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-#include <cy_conf.h>
-
-extern int diag_led(int type, int act);
-extern int C_led(int i);
-extern int get_single_ip(char *ipaddr, int which);
-extern char *get_mac_from_ip(char *ip);
-extern struct dns_lists *get_dns_list(int no);
-extern int dns_to_resolv(void);
-extern char *get_wan_face(void);
-extern int check_wan_link(int num);
-extern char *get_complete_lan_ip(char *ip);
-extern int get_int_len(int num);
-extern int file_to_buf(char *path, char *buf, int len);
-extern int buf_to_file(char *path, char *buf);
-extern pid_t* find_pid_by_name( char* pidName);
-extern int find_pid_by_ps(char* pidName);
-extern int *find_all_pid_by_ps(char* pidName);
-extern char *find_name_by_proc(int pid);
-extern int get_ppp_pid(char *file);
-extern long convert_ver(char *ver);
-extern int check_flash(void);
-extern int check_action(void);
-extern int check_now_boot(void);
-extern int check_hw_type(void);
-extern int is_exist(char *filename);
-extern void set_ip_forward(char c);
-struct mtu_lists *get_mtu(char *proto);
-extern void set_host_domain_name(void);
-
-extern void encode(char *buf, int len);
-extern void decode(char *buf, int len);
-
-extern int sys_netdev_ioctl(int family, int socket, char *if_name, int cmd, struct ifreq *ifr);
-
-int ct_openlog(const char *ident, int option, int facility, char *log_name);
-void ct_syslog(int level, int enable, const char *fmt,...);
-void ct_logger(int level, const char *fmt,...);
-struct wl_assoc_mac * get_wl_assoc_mac(int *c);
-       
-
-
-enum { DMZ, SESSION, DIAG , WL};
-
-enum { START_LED, STOP_LED };
-
-typedef enum { ACT_IDLE, 
-              ACT_TFTP_UPGRADE, 
-              ACT_WEB_UPGRADE, 
-              ACT_WEBS_UPGRADE, 
-              ACT_SW_RESTORE, 
-              ACT_HW_RESTORE } ACTION;
-
-enum { UNKNOWN_BOOT = -1, PMON_BOOT, CFE_BOOT };
-
-enum { BCM4702_CHIP, BCM4712_CHIP, BCM5325E_CHIP };
-
-enum { FIRST, SECOND };
-
-enum { SYSLOG_LOG=1, SYSLOG_DEBUG, CONSOLE_ONLY, LOG_CONSOLE, DEBUG_CONSOLE };
-
-#define ACTION(cmd)    buf_to_file(ACTION_FILE, cmd)
-
-struct dns_lists {
-        int num_servers;
-        char dns_server[4][16];
-};
-
-#define NOT_USING      0
-#define USING          1
-
-struct wl_assoc_mac
-{
-       char mac[18];
-};
-
-struct mtu_lists {
-        char   *proto; /* protocol */
-        char   *min;   /* min mtu */
-        char   *max;   /* max mtu */
-};
-
-
-#define PPP_PSEUDO_IP  "10.64.64.64"
-#define PPP_PSEUDO_NM  "255.255.255.255"
-#define PPP_PSEUDO_GW  "10.112.112.112"
-
-#define PING_TMP       "/tmp/ping.log"
-#define TRACEROUTE_TMP "/tmp/traceroute.log"
-#define MAX_BUF_LEN    254
-
-#define RESOLV_FILE    "/tmp/resolv.conf"
-#define HOSTS_FILE     "/tmp/hosts"
-
-#define LOG_FILE       "/var/log/mess"
-
-#define ACTION_FILE    "/tmp/action"
-
-
-#define split(word, wordlist, next, delim) \
-       for (next = wordlist, \
-            strncpy(word, next, sizeof(word)), \
-            word[(next=strstr(next, delim)) ? strstr(word, delim) - word : sizeof(word) - 1] = '\0', \
-            next = next ? next + sizeof(delim) - 1 : NULL ; \
-            strlen(word); \
-            next = next ? : "", \
-            strncpy(word, next, sizeof(word)), \
-            word[(next=strstr(next, delim)) ? strstr(word, delim) - word : sizeof(word) - 1] = '\0', \
-            next = next ? next + sizeof(delim) - 1 : NULL)
-
-#define STRUCT_LEN(name)    sizeof(name)/sizeof(name[0])
-
-#define printHEX(str,len) { \
-       int i; \
-       for (i=0 ; i<len ; i++) { \
-               printf("%02X ", (unsigned char)*(str+i)); \
-               if(((i+1)%16) == 0) printf("- "); \
-               if(((i+1)%32) == 0) printf("\n"); \
-       } \
-       printf("\n\n"); \
-}
-
-
-#define printASC(str,len) { \
-       int i; \
-       for (i=0 ; i<len ; i++) { \
-               printf("%c", (unsigned char)*(str+i)); \
-               if(((i+1)%16) == 0) printf("- "); \
-               if(((i+1)%32) == 0) printf("\n"); \
-       } \
-       printf("\n\n"); \
-}
index d5ef11f9ed0d02ea8ff17a8e39ecc0b725ca2062..0ebbcca644df983d7b7afa2c75cc496b8aa0b570 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Definitions subject to change without notice.
  *
- * Copyright 2004, Broadcom Corporation
+ * Copyright 2006, Broadcom Corporation
  * All Rights Reserved.
  * 
  * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
 
 #include <typedefs.h>
 #include <proto/ethernet.h>
+#include <proto/bcmeth.h>
+#include <proto/bcmevent.h>
 #include <proto/802.11.h>
 
-#if defined(__GNUC__)
-#define        PACKED  __attribute__((packed))
-#else
-#define        PACKED
+#ifdef __NetBSD__
+/* NetBSD 2.0 does not have SIOCDEVPRIVATE. This is NetBSD 2.0 specific */
+#define SIOCDEVPRIVATE _IOWR('i', 139, struct ifreq)
 #endif
 
-#define WLC_ESSID_MAX_SIZE     32
-
-#define WL_NUMRATES            255     /* max # of rates in a rateset */
-
-typedef struct wl_rateset {
-       uint32  count;                  /* # rates in this set */
-       uint8   rates[WL_NUMRATES];     /* rates in 500kbps units w/hi bit set if basic */
-} wl_rateset_t;
+/* require default structure packing */
+#if !defined(__GNUC__)
+#pragma pack(push, 8)
+#endif
 
-#define WL_CHANSPEC_CHAN_MASK  0x0fff
-#define WL_CHANSPEC_BAND_MASK  0xf000
-#define WL_CHANSPEC_BAND_SHIFT 12
-#define WL_CHANSPEC_BAND_A     0x1000
-#define WL_CHANSPEC_BAND_B     0x2000
+/* A chanspec holds the channel number, band, bandwidth and control sideband */
+typedef uint16 chanspec_t;
+#define WL_CHANSPEC_CHAN_MASK          0x00ff
+
+#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
+
+/* Legacy structure to help keep backward compatible wl tool and tray app */
+
+#define        LEGACY_WL_BSS_INFO_VERSION      107     /* older version of wl_bss_info struct */
+
+typedef struct wl_bss_info_107 {
+       uint32          version;                /* version field */
+       uint32          length;                 /* byte length of data in this record,
+                                                * starting at version and including IEs
+                                                */
+       struct ether_addr BSSID;
+       uint16          beacon_period;          /* units are Kusec */
+       uint16          capability;             /* Capability information */
+       uint8           SSID_len;
+       uint8           SSID[32];
+       struct {
+               uint    count;                  /* # rates in this set */
+               uint8   rates[16];              /* rates in 500kbps units w/hi bit set if basic */
+       } rateset;                              /* supported rates */
+       uint8           channel;                /* Channel no. */
+       uint16          atim_window;            /* units are Kusec */
+       uint8           dtim_period;            /* DTIM period */
+       int16           RSSI;                   /* receive signal strength (in dBm) */
+       int8            phy_noise;              /* noise (in dBm) */
+       uint32          ie_length;              /* byte length of Information Elements */
+       /* variable length Information Elements */
+} wl_bss_info_107_t;
 
 /*
  * Per-bss information structure.
  */
 
-#define        WL_LEGACY_BSS_INFO_VERSION      106     /* an older supported version of wl_bss_info struct */
-#define        WL_BSS_INFO_VERSION             107     /* current version of wl_bss_info struct */
-
-typedef struct wl_bss_info106 {
-       uint            version;        /* version field */
-       struct ether_addr BSSID;
-       uint8           SSID_len;
-       uint8           SSID[32];
-       uint8           Privacy;        /* 0=No WEP, 1=Use WEP */
-       int16           RSSI;           /* receive signal strength (in dBm) */
-       uint16          beacon_period;  /* units are Kusec */
-       uint16          atim_window;    /* units are Kusec */
-       uint8           channel;        /* Channel no. */
-       int8            infra;          /* 0=IBSS, 1=infrastructure, 2=unknown */
-       struct {
-               uint    count;          /* # rates in this set */
-               uint8   rates[12];      /* rates in 500kbps units w/hi bit set if basic */
-       } rateset;                      /* supported rates */
-        uint8           dtim_period;    /* DTIM period */
-       int8            phy_noise;      /* noise right after tx (in dBm) */
-       uint16          capability;     /* Capability information */
-       struct dot11_bcn_prb *prb;      /* probe response frame (ioctl na) */
-       uint16          prb_len;        /* probe response frame length (ioctl na) */
-       struct {
-               uint8 supported;        /* wpa supported */
-               uint8 multicast;        /* multicast cipher */
-               uint8 ucount;           /* count of unicast ciphers */
-               uint8 unicast[4];       /* unicast ciphers */
-               uint8 acount;           /* count of auth modes */
-               uint8 auth[4];          /* Authentication modes */
-       } wpa;
-} wl_bss_info106_t;
+#define        WL_BSS_INFO_VERSION     108             /* current version of wl_bss_info struct */
 
+/* BSS info structure
+ * Applications MUST CHECK ie_offset field and length field to access IEs and
+ * next bss_info structure in a vector (in wl_scan_results_t)
+ */
 typedef struct wl_bss_info {
-       uint32          version;        /* version field */
-       uint32          length;         /* byte length of data in this record, starting at version and including IEs */
+       uint32          version;                /* version field */
+       uint32          length;                 /* byte length of data in this record,
+                                                * starting at version and including IEs
+                                                */
        struct ether_addr BSSID;
-       uint16          beacon_period;  /* units are Kusec */
-       uint16          capability;     /* Capability information */
+       uint16          beacon_period;          /* units are Kusec */
+       uint16          capability;             /* Capability information */
        uint8           SSID_len;
        uint8           SSID[32];
        struct {
-               uint    count;          /* # rates in this set */
-               uint8   rates[16];      /* rates in 500kbps units w/hi bit set if basic */
-       } rateset;                      /* supported rates */
-       uint8           channel;        /* Channel no. */
-       uint16          atim_window;    /* units are Kusec */
-        uint8           dtim_period;    /* DTIM period */
-       int16           RSSI;           /* receive signal strength (in dBm) */
-       int8            phy_noise;      /* noise (in dBm) */
-       uint32          ie_length;      /* byte length of Information Elements */
+               uint    count;                  /* # rates in this set */
+               uint8   rates[16];              /* rates in 500kbps units w/hi bit set if basic */
+       } rateset;                              /* supported rates */
+       chanspec_t      chanspec;               /* chanspec for bss */
+       uint16          atim_window;            /* units are Kusec */
+       uint8           dtim_period;            /* DTIM period */
+       int16           RSSI;                   /* receive signal strength (in dBm) */
+       int8            phy_noise;              /* noise (in dBm) */
+
+       bool            n_cap;                  /* BSS is 802.11N Capable */
+       uint32          nbss_cap;               /* 802.11N BSS Capabilities (based on EWC_CAP_*) */
+       uint8           ctl_ch;                 /* 802.11N BSS control channel number */
+       uint32          reserved[2];            /* Reserved for expansion of BSS properties */
+       uint8           basic_mcs[MCSSET_LEN];  /* 802.11N BSS required MCS set */
+
+       uint16          ie_offset;              /* offset at which IEs start, from beginning */
+       uint32          ie_length;              /* byte length of Information Elements */
+       /* Add new fields here */
        /* variable length Information Elements */
 } wl_bss_info_t;
 
@@ -107,16 +131,26 @@ typedef struct wlc_ssid {
 } wlc_ssid_t;
 
 typedef struct wl_scan_params {
-       wlc_ssid_t ssid;        /* default is {0, ""} */
-       struct ether_addr bssid;/* default is bcast */
-       int8 bss_type;          /* default is any, DOT11_BSSTYPE_ANY/INFRASTRUCTURE/INDEPENDENT */
-       int8 scan_type;         /* -1 use default, DOT11_SCANTYPE_ACTIVE/PASSIVE */
-       int32 nprobes;          /* -1 use default, number of probes per channel */
-       int32 active_time;      /* -1 use default, dwell time per channel for active scanning */
-       int32 passive_time;     /* -1 use default, dwell time per channel for passive scanning */
-       int32 home_time;        /* -1 use default, dwell time for the home channel between channel scans */
-       int32 channel_num;      /* 0 use default (all available channels), count of channels in channel_list */
-       uint16 channel_list[1]; /* list of chanspecs */
+       wlc_ssid_t ssid;                /* default: {0, ""} */
+       struct ether_addr bssid;        /* default: bcast */
+       int8 bss_type;                  /* default: any,
+                                        * DOT11_BSSTYPE_ANY/INFRASTRUCTURE/INDEPENDENT
+                                        */
+       int8 scan_type;                 /* -1 use default, DOT11_SCANTYPE_ACTIVE/PASSIVE */
+       int32 nprobes;                  /* -1 use default, number of probes per channel */
+       int32 active_time;              /* -1 use default, dwell time per channel for
+                                        * active scanning
+                                        */
+       int32 passive_time;             /* -1 use default, dwell time per channel
+                                        * for passive scanning
+                                        */
+       int32 home_time;                /* -1 use default, dwell time for the home channel
+                                        * between channel scans
+                                        */
+       int32 channel_num;              /* 0 use default (all available channels), count of
+                                        * channels in channel_list
+                                        */
+       uint16 channel_list[1];         /* list of chanspecs */
 } wl_scan_params_t;
 /* size of wl_scan_params not including variable length array */
 #define WL_SCAN_PARAMS_FIXED_SIZE 64
@@ -130,6 +164,13 @@ typedef struct wl_scan_results {
 /* size of wl_scan_results not including variable length array */
 #define WL_SCAN_RESULTS_FIXED_SIZE 12
 
+
+#define WL_NUMRATES            255     /* max # of rates in a rateset */
+typedef struct wl_rateset {
+       uint32  count;                  /* # rates in this set */
+       uint8   rates[WL_NUMRATES];     /* rates in 500kbps units w/hi bit set if basic */
+} wl_rateset_t;
+
 /* uint32 list */
 typedef struct wl_uint32_list {
        /* in - # of elements, out - # of entries */
@@ -138,7 +179,18 @@ typedef struct wl_uint32_list {
        uint32 element[1];
 } wl_uint32_list_t;
 
-#define WLC_CNTRY_BUF_SZ        4       /* Country string is 3 bytes + NULL */
+#define WLC_CNTRY_BUF_SZ       4               /* Country string is 3 bytes + NULL */
+
+/* defines used by the nrate iovar */
+#define NRATE_MCS_INUSE        0x00000080      /* MSC in use,indicates b0-6 holds an mcs */
+#define NRATE_RATE_MASK 0x0000007f     /* rate/mcs value */
+#define NRATE_STF_MASK 0x0000ff00      /* stf mode mask: siso, cdd, stbc, sdm */
+#define NRATE_STF_SHIFT        8               /* stf mode shift */
+
+#define ANTENNA_NUM_1  1               /* total number of antennas to be used */
+#define ANTENNA_NUM_2  2
+#define ANTENNA_NUM_3  3
+#define ANTENNA_NUM_4  4
 
 typedef struct wl_channels_in_country {
        uint32 buflen;
@@ -169,7 +221,7 @@ typedef struct wl_country_list {
 typedef struct wl_rm_req_elt {
        int8    type;
        int8    flags;
-       uint16  chanspec;
+       chanspec_t      chanspec;
        uint32  token;          /* token for this measurement */
        uint32  tsf_h;          /* TSF high 32-bits of Measurement start time */
        uint32  tsf_l;          /* TSF low 32-bits */
@@ -178,7 +230,7 @@ typedef struct wl_rm_req_elt {
 
 typedef struct wl_rm_req {
        uint32  token;          /* overall measurement set token */
-       uint32  count;          /* number of measurement reqests */
+       uint32  count;          /* number of measurement requests */
        wl_rm_req_elt_t req[1]; /* variable length block of requests */
 } wl_rm_req_t;
 #define WL_RM_REQ_FIXED_LEN    8
@@ -186,7 +238,7 @@ typedef struct wl_rm_req {
 typedef struct wl_rm_rep_elt {
        int8    type;
        int8    flags;
-       uint16  chanspec;
+       chanspec_t      chanspec;
        uint32  token;          /* token for this measurement */
        uint32  tsf_h;          /* TSF high 32-bits of Measurement start time */
        uint32  tsf_l;          /* TSF low 32-bits */
@@ -210,28 +262,7 @@ typedef struct wl_rm_rep {
 #define WL_RM_REP_FIXED_LEN    8
 
 
-#define WLC_MAX_KEY_SIZE       32      /* max size of any key */
-#define WLC_MAX_IV_SIZE                16      /* max size of any IV */
-#define WLC_EXT_IV_FLAG                (1<<5)  /* flag to indicate IV is > 4 bytes */
-#define WLC_MAX_DEFAULT_KEYS   4       /* # of default WEP keys */
-#define WLC_MAX_KEYS           54      /* Max # of WEP keys */
-#define WLC_WEP1_KEY_SIZE      5       /* max size of any WEP key */
-#define WLC_WEP1_KEY_HEX_SIZE  10      /* size of WEP key in hex. */
-#define WLC_WEP128_KEY_SIZE    13      /* max size of any WEP key */
-#define WLC_WEP128_KEY_HEX_SIZE        26      /* size of WEP key in hex. */
-#define WLC_TKIP_MIC_SIZE      8       /* size of TKIP MIC */
-#define WLC_TKIP_EOM_SIZE      7       /* max size of TKIP EOM */
-#define WLC_TKIP_EOM_FLAG      0x5a    /* TKIP EOM flag byte */
-#define WLC_TKIP_KEY_SIZE      32      /* size of any TKIP key */
-#define WLC_TKIP_MIC_AUTH_TX   16      /* offset to Authenticator MIC TX key */
-#define WLC_TKIP_MIC_AUTH_RX   24      /* offset to Authenticator MIC RX key */
-#define WLC_TKIP_MIC_SUP_RX    16      /* offset to Supplicant MIC RX key */
-#define WLC_TKIP_MIC_SUP_TX    24      /* offset to Supplicant MIC TX key */
-#define WLC_TKIP_P1_KEY_SIZE   10      /* size of TKHash Phase1 output, in bytes */
-#define WLC_TKIP_P2_KEY_SIZE   16      /* size of TKHash Phase2 output */
-#define WLC_AES_KEY_SIZE       16      /* size of AES key */
-
-
+#if defined(BCMSUP_PSK)
 typedef enum sup_auth_status {
        WLC_SUP_DISCONNECTED = 0,
        WLC_SUP_CONNECTING,
@@ -239,8 +270,10 @@ typedef enum sup_auth_status {
        WLC_SUP_AUTHENTICATING,
        WLC_SUP_AUTHENTICATED,
        WLC_SUP_KEYXCHANGE,
-       WLC_SUP_KEYED
+       WLC_SUP_KEYED,
+       WLC_SUP_TIMEOUT
 } sup_auth_status_t;
+#endif /* BCMCCX | BCMSUP_PSK */
 
 /* Enumerate crypto algorithms */
 #define        CRYPTO_ALGO_OFF                 0
@@ -260,39 +293,6 @@ typedef enum sup_auth_status {
 #define WL_KF_RES_4    (1 << 4)        /* Reserved for backward compat */
 #define WL_KF_RES_5    (1 << 5)        /* Reserved for backward compat */
 
-
-typedef struct wlc_tkip_info {
-       uint16          phase1[WLC_TKIP_P1_KEY_SIZE/sizeof(uint16)];    /* tkhash phase1 result */
-       uint8           phase2[WLC_TKIP_P2_KEY_SIZE];   /* tkhash phase2 result */
-       uint32          micl;
-       uint32          micr;
-} tkip_info_t;
-
-typedef struct _wsec_iv {
-       uint32          hi;     /* upper 32 bits of IV */
-       uint16          lo;     /* lower 16 bits of IV */
-} wsec_iv_t;
-
-typedef struct wsec_key {
-       uint32          index;          /* key index */
-       uint32          len;            /* key length */
-       uint8           data[WLC_MAX_KEY_SIZE]; /* key data */
-       tkip_info_t     tkip_tx;        /* tkip transmit state */
-       tkip_info_t     tkip_rx;        /* tkip receive state */
-       uint32          algo;           /* CRYPTO_ALGO_AES_CCM, CRYPTO_ALGO_WEP128, etc */
-       uint32          flags;          /* misc flags */
-       uint32          algo_hw;        /* cache for hw register*/
-       uint32          aes_mode;       /* cache for hw register*/
-       int             iv_len;         /* IV length */         
-       int             iv_initialized; /* has IV been initialized already? */          
-       int             icv_len;        /* ICV length */
-       wsec_iv_t       rxiv;           /* Rx IV */
-       wsec_iv_t       txiv;           /* Tx IV */
-       struct ether_addr ea;           /* per station */
-} wsec_key_t;
-
-
-
 typedef struct wl_wsec_key {
        uint32          index;          /* key index */
        uint32          len;            /* key length */
@@ -300,9 +300,9 @@ typedef struct wl_wsec_key {
        uint32          pad_1[18];
        uint32          algo;           /* CRYPTO_ALGO_AES_CCM, CRYPTO_ALGO_WEP128, etc */
        uint32          flags;          /* misc flags */
-       uint32          pad_2[2];
+       uint32          pad_2[2];
        int             pad_3;
-       int             iv_initialized; /* has IV been initialized already? */          
+       int             iv_initialized; /* has IV been initialized already? */
        int             pad_4;
        /* Rx IV */
        struct {
@@ -313,17 +313,13 @@ typedef struct wl_wsec_key {
        struct ether_addr ea;           /* per station */
 } wl_wsec_key_t;
 
-/* For use with wlc_wep_key.flags */
-#define WSEC_PRIMARY_KEY       (1 << 1)        /* Indicates this key is the primary (ie tx) key */
-#define WSEC_TKIP_ERROR                (1 << 2)        /* Provoke deliberate error */
-
 #define WSEC_MIN_PSK_LEN       8
 #define WSEC_MAX_PSK_LEN       64
 
 /* Flag for key material needing passhash'ing */
 #define WSEC_PASSPHRASE                (1<<0)
 
-/* recepticle for WLC_SET_WSEC_PMK parameter */
+/* receptacle for WLC_SET_WSEC_PMK parameter */
 typedef struct {
        ushort  key_len;                /* octets in key material */
        ushort  flags;                  /* key handling qualification */
@@ -331,32 +327,50 @@ typedef struct {
 } wsec_pmk_t;
 
 /* wireless security bitvec */
-#define WEP_ENABLED            1
-#define TKIP_ENABLED           2
-#define AES_ENABLED            4
-#define WSEC_SWFLAG            8
-
-#define WSEC_SW(wsec)          ((wsec) & WSEC_SWFLAG)
-#define WSEC_HW(wsec)          (!WSEC_SW(wsec))
-#define WSEC_WEP_ENABLED(wsec) ((wsec) & WEP_ENABLED)
-#define WSEC_TKIP_ENABLED(wsec)        ((wsec) & TKIP_ENABLED)
-#define WSEC_AES_ENABLED(wsec) ((wsec) & AES_ENABLED)
-#define WSEC_ENABLED(wsec)     ((wsec) & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED))
-
-
-/* wireless authentication bit vector */
-#define WPA_ENABLED    1
-#define PSK_ENABLED    2
-
-#define WAUTH_WPA_ENABLED(wauth)       ((wauth) & WPA_ENABLED)
-#define WAUTH_PSK_ENABLED(wauth)       ((wauth) & PSK_ENABLED)
-#define WAUTH_ENABLED(wauth)           ((wauth) & (WPA_ENABLED | PSK_ENABLED))
-
-/* group/mcast cipher */
-#define WPA_MCAST_CIPHER(wsec) (((wsec) & TKIP_ENABLED) ? WPA_CIPHER_TKIP : \
-                               ((wsec) & AES_ENABLED) ? WPA_CIPHER_AES_CCM : \
-                               WPA_CIPHER_NONE)
-
+#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 */
+#define FIPS_ENABLED   0x0080
+
+/* 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_8021X 0x0020 */    /* 802.1x, reserved */
+#ifdef BCMWPA2
+#define WPA2_AUTH_UNSPECIFIED  0x0040  /* over 802.1x */
+#define WPA2_AUTH_PSK          0x0080  /* Pre-shared key */
+#endif /* BCMWPA2 */
+
+#ifdef BCMWPA2
+/* pmkid */
+#define        MAXPMKID                16      
+
+typedef struct _pmkid
+{
+       struct ether_addr       BSSID;
+       uint8                   PMKID[WPA2_PMKID_LEN];
+} pmkid_t;
+
+typedef struct _pmkid_list
+{
+       uint32  npmkid;
+       pmkid_t pmkid[1];
+} pmkid_list_t;
+
+typedef struct _pmkid_cand {
+       struct ether_addr       BSSID;
+       uint8                   preauth;
+} pmkid_cand_t;
+
+typedef struct _pmkid_cand_list {
+       uint32  npmkid_cand;
+       pmkid_cand_t    pmkid_cand[1];
+} pmkid_cand_list_t;
+#endif /* BCMWPA2 */
 
 typedef struct wl_led_info {
        uint32          index;          /* led index */
@@ -364,77 +378,20 @@ typedef struct wl_led_info {
        bool            activehi;
 } wl_led_info_t;
 
-/*
- * definitions for driver messages passed from WL to NAS.
- */
-/* Use this to recognize wpa and 802.1x driver messages. */
-static const uint8 wl_wpa_snap_template[] =
-       { 0xaa, 0xaa, 0x03, 0x00, 0x90, 0x4c };
-
-#define WL_WPA_MSG_IFNAME_MAX  16
-
-/* WPA driver message */
-typedef struct wl_wpa_header {
-       struct ether_header eth;
-       struct dot11_llc_snap_header snap;
-       uint8 version;
-       uint8 type;
-       /* version 2 additions */
-       char ifname[WL_WPA_MSG_IFNAME_MAX];
-       /* version specific data */
-       /* uint8 data[1]; */
-} wl_wpa_header_t PACKED;
-
-/*
- * definitions for 802.2 messages passed from WL to NAS.
- */
-/* This seems not to be defined outside the kernel on linux. */
-#ifndef ETH_P_802_2
-#define ETH_P_802_2            4
-#endif
-
-#define WL_WPA_HEADER_LEN      (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN + 2 + WL_WPA_MSG_IFNAME_MAX)
-
-/* WPA driver message ethertype - private between wlc and nas */
-#define WL_WPA_ETHER_TYPE      0x9999
-
-/* WPA driver message current version */
-#define WL_WPA_MSG_VERSION     2
-
-/* Type field values for the 802.2 driver messages for WPA. */
-#define WLC_ASSOC_MSG          1
-#define WLC_DISASSOC_MSG       2
-#define WLC_PTK_MIC_MSG                3
-#define WLC_GTK_MIC_MSG                4
-
-/* Use this to recognize 802.2 driver messages. */
-static const uint8 wpa_snap_template[] =
-       { 0xaa, 0xaa, 0x03, 0x00, 0x90, 0x4c };
-
-
-/* 802.1x driver message */
-typedef struct wl_eapol_header {
-       struct ether_header eth;
-       struct dot11_llc_snap_header snap;
-       uint8 version;
-       uint8 reserved;
-       char ifname[WL_WPA_MSG_IFNAME_MAX];
-       /* version specific data */
-       /* uint8 802_1x_msg[1]; */
-} wl_eapol_header_t PACKED;
-
-#define WL_EAPOL_HEADER_LEN    (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN + 2 + WL_WPA_MSG_IFNAME_MAX)
-
-/* 802.1x driver message ethertype - private between wlc and nas */
-#define WL_EAPOL_ETHER_TYPE    0x999A
-
-/* 802.1x driver message current version */
-#define WL_EAPOL_MSG_VERSION   1
-
+typedef struct wlc_assoc_info {
+       uint32          req_len;
+       uint32          resp_len;
+       uint32          flags;
+       struct dot11_assoc_req req;
+       struct ether_addr reassoc_bssid; /* used in reassoc's */
+       struct dot11_assoc_resp resp;
+} wl_assoc_info_t;
+/* flags */
+#define WLC_ASSOC_REQ_IS_REASSOC 0x01 /* assoc req was actually a reassoc */
 /* srom read/write struct passed through ioctl */
 typedef struct {
-       uint   byteoff;         /* byte offset */
-       uint   nbytes;          /* number of bytes */
+       uint    byteoff;                /* byte offset */
+       uint    nbytes;         /* number of bytes */
        uint16 buf[1];
 } srom_rw_t;
 
@@ -443,132 +400,89 @@ typedef struct {
        uint32  byteoff;        /* byte offset of the field in d11regs_t */
        uint32  val;            /* read/write value of the field */
        uint32  size;           /* sizeof the field */
+       uint    band;           /* band (optional) */
 } rw_reg_t;
 
-/* Structure used by GET/SET_ATTEN ioctls */
+/* Structure used by GET/SET_ATTEN ioctls - it controls power in b/g-band */
+/* PCL - Power Control Loop */
+/* current gain setting is replaced by user input */
+#define WL_ATTEN_APP_INPUT_PCL_OFF     0       /* turn off PCL, apply supplied input */
+#define WL_ATTEN_PCL_ON                        1       /* turn on PCL */
+/* current gain setting is maintained */
+#define WL_ATTEN_PCL_OFF               2       /* turn off PCL. */
 typedef struct {
-       uint16  auto_ctrl;      /* 1: Automatic control, 0: overriden */
+       uint16  auto_ctrl;      /* WL_ATTEN_XX */
        uint16  bb;             /* Baseband attenuation */
        uint16  radio;          /* Radio attenuation */
        uint16  txctl1;         /* Radio TX_CTL1 value */
 } atten_t;
 
-/* Used to get specific STA parameters */ 
+/* defines used by poweridx iovar - it controls power in a-band */
+/* current gain setting is maintained */
+#define WL_PWRIDX_PCL_OFF      -2      /* turn off PCL.  */
+#define WL_PWRIDX_PCL_ON       -1      /* turn on PCL */
+#define WL_PWRIDX_LOWER_LIMIT  -2      /* lower limit */
+#define WL_PWRIDX_UPPER_LIMIT  63      /* upper limit */
+/* value >= 0 causes
+ *     - input to be set to that value
+ *     - PCL to be off
+ */
+
+/* Used to get specific STA parameters */
 typedef struct {
        uint32  val;
        struct ether_addr ea;
 } scb_val_t;
 
-/* callback registration data types */
-
-typedef struct _mac_event_params {
-       uint msg;
-       struct ether_addr *addr;
-       uint result;
-       uint status; 
-       uint auth_type;
-} mac_event_params_t;
-
-typedef struct _mic_error_params {
-       struct ether_addr *ea;
-       bool group;
-       bool flush_txq;
-} mic_error_params_t;
-
-typedef enum _wl_callback {
-       WL_MAC_EVENT_CALLBACK = 0,
-       WL_LINK_UP_CALLBACK,
-       WL_LINK_DOWN_CALLBACK,
-       WL_MIC_ERROR_CALLBACK,
-       WL_LAST_CALLBACK
-} wl_callback_t;
-
-typedef struct _callback {
-       void (*fn)(void *, void *);
-       void *context;
-} callback_t;
-
-typedef struct _scan_callback {
-       void (*fn)(void *);
-       void *context;
-} scan_callback_t;
-
-/* used to register an arbitrary callback via the IOCTL interface */
-typedef struct _set_callback {
-       int index;
-       callback_t callback;
-} set_callback_t;
-
-
 
 /* Event data type */
-typedef struct {
-       uint msg;                       /* Message (see below) */
-       struct ether_addr *addr;        /* Station address (if applicable) */
-       uint status;                    /* Status code (see below) */
-       uint reason;                    /* Reason code (if applicable) */
-       uint auth_type;                 /* WLC_E_AUTH */
-       bool link;                      /* WLC_E_LINK */
-       bool group;                     /* WLC_E_MIC_ERROR */
-       bool flush_txq;                 /* WLC_E_MIC_ERROR */
+typedef struct wlc_event {
+       wl_event_msg_t event;           /* encapsulated event */
+       struct ether_addr *addr;        /* used to keep a trace of the potential present of
+                                        * an address in wlc_event_msg_t
+                                        */
+       void *data;                     /* used to hang additional data on an event */
+       struct wlc_event *next;         /* enables ordered list of pending events */
 } wlc_event_t;
 
+#define BCM_MAC_STATUS_INDICATION      (0x40010200L)
+
+/* Please update the following when modifying this structure:
+ *    StaInfo Twiki page flags section - description of the sta_info_t struct
+ *    src/wl/exe/wlu.c - print of sta_info_t
+ * Pay attention to version if structure changes.
+ */
 typedef struct {
-       uint16          ver;    /* version of this struct */
-       uint16          cap;    /* sta's advertized capabilities */
-       uint32          flags;  /* flags defined below */
-       uint32          idle;   /* time since data pkt rx'd from sta */
-       struct ether_addr       ea;     /* Station address */
-       wl_rateset_t    rateset;        /* rateset in use */
+       uint16                  ver;            /* version of this struct */
+       uint16                  len;            /* length in bytes of this structure */
+       uint16                  cap;            /* sta's advertised capabilities */
+       uint32                  flags;          /* flags defined below */
+       uint32                  idle;           /* time since data pkt rx'd from sta */
+       struct ether_addr       ea;             /* Station address */
+       wl_rateset_t            rateset;        /* rateset in use */
+       uint32                  in;             /* seconds elapsed since associated */
+       uint32                  listen_interval_inms; /* Min Listen interval in ms for this STA */
 } sta_info_t;
 
-#define WL_STA_INFO_LEN        300
-#define WL_STA_VER     1
-
-/* flags fields */
-#define WL_STA_BRCM    0x01
-#define WL_STA_WME     0x02
-#define WL_STA_ABCAP   0x04
-#define WL_STA_AUTHE   0x08 
-#define WL_STA_ASSOC   0x10 
-#define WL_STA_AUTHO   0x20 
-
-/* Event messages */
-#define WLC_E_SET_SSID         1
-#define WLC_E_JOIN             2
-#define WLC_E_START            3
-#define WLC_E_AUTH             4
-#define WLC_E_AUTH_IND         5
-#define WLC_E_DEAUTH           6
-#define WLC_E_DEAUTH_IND       7
-#define WLC_E_ASSOC            8
-#define WLC_E_ASSOC_IND                9
-#define WLC_E_REASSOC          10
-#define WLC_E_REASSOC_IND      11
-#define WLC_E_DISASSOC         12
-#define WLC_E_DISASSOC_IND     13
-#define WLC_E_QUIET_START      14      /* 802.11h Quiet period started */
-#define WLC_E_QUIET_END                15      /* 802.11h Quiet period ended */
-#define WLC_E_GOT_BEACONS      16      
-#define WLC_E_LINK             17      /* Link indication */
-#define WLC_E_MIC_ERROR                18      /* TKIP MIC error occurred */
-#define WLC_E_NDIS_LINK                19      /* NDIS style link indication */
-#define WLC_E_ROAM             20
-#define WLC_E_LAST             21
-
-/* Event status codes */
-#define WLC_E_STATUS_SUCCESS           0
-#define WLC_E_STATUS_FAIL              1
-#define WLC_E_STATUS_TIMEOUT           2
-#define WLC_E_STATUS_NO_NETWORKS       3
-#define WLC_E_STATUS_ABORT             4
-
-typedef struct wlc_event_cb {
-       uint msg;                               /* Event message or 0 for all */
-       void (*fn)(void *, wlc_event_t *);      /* Callback function */
-       void *context;                          /* Passed to callback function */
-       struct wlc_event_cb *next;              /* Next in the chain */
-} wlc_event_cb_t;
+#define WL_STA_VER             2
+
+/* Flags for sta_info_t indicating properties of STA */
+#define WL_STA_BRCM            0x1             /* Running a Broadcom driver */
+#define WL_STA_WME             0x2             /* WMM association */
+#define WL_STA_ABCAP           0x4             /* Afterburner-capable */
+#define WL_STA_AUTHE           0x8             /* Authenticated */
+#define WL_STA_ASSOC           0x10            /* Associated */
+#define WL_STA_AUTHO           0x20            /* Authorized */
+#define WL_STA_WDS             0x40            /* Wireless Distribution System */
+#define WL_STA_WDS_LINKUP      0x80            /* WDS traffic/probes flowing properly */
+#define WL_STA_PS              0x100           /* STA is in power save mode from AP's viewpoint */
+#define WL_STA_APSD_BE         0x200           /* APSD delv/trigger for AC_BE is default enabled */
+#define WL_STA_APSD_BK         0x400           /* APSD delv/trigger for AC_BK is default enabled */
+#define WL_STA_APSD_VI         0x800           /* APSD delv/trigger for AC_VI is default enabled */
+#define WL_STA_APSD_VO         0x1000          /* APSD delv/trigger for AC_VO is default enabled */
+#define WL_STA_N_CAP           0x2000          /* STA 802.11n capable */
+
+#define WL_WDS_LINKUP          WL_STA_WDS_LINKUP       /* deprecated */
 
 /*
  * Country locale determines which channels are available to us.
@@ -585,7 +499,7 @@ typedef enum _wlc_locale {
        WLC_USL,        /* US Low Band only */
        WLC_JPH,        /* Japan High Band only */
        WLC_ALL,        /* All the channels in this band */
-       WLC_11D,        /* Represents locale recieved by 11d beacons */
+       WLC_11D,        /* Represents locale received by 11d beacons */
        WLC_LAST_LOCALE,
        WLC_UNDEFINED_LOCALE = 0xf
 } wlc_locale_t;
@@ -621,9 +535,9 @@ typedef struct wl_ioctl {
        uint needed;    /* bytes needed (optional) */
 } wl_ioctl_t;
 
-/* 
- * Structure for passing hardware and software 
- * revision info up from the driver. 
+/*
+ * Structure for passing hardware and software
+ * revision info up from the driver.
  */
 typedef struct wlc_rev_info {
        uint            vendorid;       /* PCI vendor id */
@@ -637,38 +551,41 @@ typedef struct wlc_rev_info {
        uint            driverrev;      /* driver version */
        uint            ucoderev;       /* microcode version */
        uint            bus;            /* bus type */
-       uint        chipnum;    /* chip number */
+       uint            chipnum;        /* chip number */
 } wlc_rev_info_t;
 
+#define WL_BRAND_MAX 10
+typedef struct wl_instance_info {
+       uint instance;
+       char brand[WL_BRAND_MAX];
+} wl_instance_info_t;
+
 /* check this magic number */
 #define WLC_IOCTL_MAGIC                0x14e46c77
 
 /* bump this number if you change the ioctl interface */
 #define WLC_IOCTL_VERSION      1
 
-/* maximum length buffer required */
-#define WLC_IOCTL_MAXLEN       8192
+#define        WLC_IOCTL_MAXLEN        8192            /* max length ioctl buffer required */
+#define        WLC_IOCTL_SMLEN         256             /* "small" length ioctl buffer required */
 
 /* common ioctl definitions */
 #define WLC_GET_MAGIC                          0
 #define WLC_GET_VERSION                                1
 #define WLC_UP                                 2
 #define WLC_DOWN                               3
-#define WLC_GET_LOOP                           4
-#define WLC_SET_LOOP                           5
 #define WLC_DUMP                               6
 #define WLC_GET_MSGLEVEL                       7
 #define WLC_SET_MSGLEVEL                       8
 #define WLC_GET_PROMISC                                9
 #define WLC_SET_PROMISC                                10
-#define WLC_OBSOLETE                           11 
 #define WLC_GET_RATE                           12
-#define WLC_SET_RATE                           13
+/* #define WLC_SET_RATE                                13 */ /* no longer supported */
 #define WLC_GET_INSTANCE                       14
-#define WLC_GET_FRAG                           15
-#define WLC_SET_FRAG                           16
-#define WLC_GET_RTS                            17
-#define WLC_SET_RTS                            18
+/* #define WLC_GET_FRAG                                15 */ /* no longer supported */
+/* #define WLC_SET_FRAG                                16 */ /* no longer supported */
+/* #define WLC_GET_RTS                         17 */ /* no longer supported */
+/* #define WLC_SET_RTS                         18 */ /* no longer supported */
 #define WLC_GET_INFRA                          19
 #define WLC_SET_INFRA                          20
 #define WLC_GET_AUTH                           21
@@ -678,7 +595,6 @@ typedef struct wlc_rev_info {
 #define WLC_GET_SSID                           25
 #define WLC_SET_SSID                           26
 #define WLC_RESTART                            27
-#define WLC_DUMP_SCB                           28 
 #define WLC_GET_CHANNEL                                29
 #define WLC_SET_CHANNEL                                30
 #define WLC_GET_SRL                            31
@@ -690,33 +606,26 @@ typedef struct wlc_rev_info {
 #define WLC_GET_RADIO                          37
 #define WLC_SET_RADIO                          38
 #define WLC_GET_PHYTYPE                                39
-#define WLC_DUMP_RATE                          40
-#define WLC_SET_RATE_PARAMS                    41
-#define WLC_GET_WEP                            42
-#define WLC_SET_WEP                            43
+/* #define WLC_GET_WEP                         42 */ /* no longer supported */
+/* #define WLC_SET_WEP                         43 */ /* no longer supported */
 #define WLC_GET_KEY                            44
 #define WLC_SET_KEY                            45
 #define WLC_GET_REGULATORY                     46
 #define WLC_SET_REGULATORY                     47
-#define WLC_GET_PASSIVE                                48      /* added by nbd */
-#define WLC_SET_PASSIVE                                49      /* added by nbd */
+#define WLC_GET_PASSIVE                        48
+#define WLC_SET_PASSIVE                        49
 #define WLC_SCAN                               50
 #define WLC_SCAN_RESULTS                       51
 #define WLC_DISASSOC                           52
 #define WLC_REASSOC                            53
 #define WLC_GET_ROAM_TRIGGER                   54
 #define WLC_SET_ROAM_TRIGGER                   55
-#define WLC_GET_ROAM_DELTA                     56
-#define WLC_SET_ROAM_DELTA                     57
-#define WLC_GET_ROAM_SCAN_PERIOD               58
-#define WLC_SET_ROAM_SCAN_PERIOD               59
-#define WLC_EVM                                        60
 #define WLC_GET_TXANT                          61
 #define WLC_SET_TXANT                          62
 #define WLC_GET_ANTDIV                         63
 #define WLC_SET_ANTDIV                         64
-#define WLC_GET_TXPWR                          65
-#define WLC_SET_TXPWR                          66
+/* #define WLC_GET_TXPWR                       65 */ /* no longer supported */
+/* #define WLC_SET_TXPWR                       66 */ /* no longer supported */
 #define WLC_GET_CLOSED                         67
 #define WLC_SET_CLOSED                         68
 #define WLC_GET_MACLIST                                69
@@ -724,7 +633,7 @@ typedef struct wlc_rev_info {
 #define WLC_GET_RATESET                                71
 #define WLC_SET_RATESET                                72
 #define WLC_GET_LOCALE                         73
-#define WLC_SET_LOCALE                         74
+#define WLC_LONGTRAIN                          74
 #define WLC_GET_BCNPRD                         75
 #define WLC_SET_BCNPRD                         76
 #define WLC_GET_DTIMPRD                                77
@@ -739,7 +648,7 @@ typedef struct wlc_rev_info {
 #define WLC_SET_PM                             86
 #define WLC_GET_WAKE                           87
 #define WLC_SET_WAKE                           88
-#define        WLC_GET_D11CNTS                         89
+#define WLC_GET_D11CNTS                                89
 #define WLC_GET_FORCELINK                      90      /* ndis only */
 #define WLC_SET_FORCELINK                      91      /* ndis only */
 #define WLC_FREQ_ACCURACY                      92
@@ -757,8 +666,8 @@ typedef struct wlc_rev_info {
 #define WLC_RESET_D11CNTS                      104
 #define WLC_GET_MACMODE                                105
 #define WLC_SET_MACMODE                                106
-#define WLC_GET_MONITOR                                107     /* added by nbd */
-#define WLC_SET_MONITOR                                108     /* added by nbd */
+#define WLC_GET_MONITOR                                107
+#define WLC_SET_MONITOR                                108
 #define WLC_GET_GMODE                          109
 #define WLC_SET_GMODE                          110
 #define WLC_GET_LEGACY_ERP                     111
@@ -803,12 +712,8 @@ typedef struct wlc_rev_info {
 #define WLC_GET_GMODE_PROTECTION_OVERRIDE      150
 #define WLC_SET_GMODE_PROTECTION_OVERRIDE      151
 #define WLC_UPGRADE                            152
-#define WLC_GET_MRATE                          153
-#define WLC_SET_MRATE                          154
-#define WLC_GET_IGNORE_BCNS                    155
-#define WLC_SET_IGNORE_BCNS                    156
-#define WLC_GET_SCB_TIMEOUT                    157
-#define WLC_SET_SCB_TIMEOUT                    158
+/* #define WLC_GET_MRATE                       153 */ /* no longer supported */
+/* #define WLC_SET_MRATE                       154 */ /* no longer supported */
 #define WLC_GET_ASSOCLIST                      159
 #define WLC_GET_CLK                            160
 #define WLC_SET_CLK                            161
@@ -816,85 +721,48 @@ typedef struct wlc_rev_info {
 #define WLC_OUT                                        163
 #define WLC_GET_WPA_AUTH                       164
 #define WLC_SET_WPA_AUTH                       165
-#define WLC_GET_UCFLAGS                                166
-#define WLC_SET_UCFLAGS                                167
-#define WLC_GET_PWRIDX                         168
-#define WLC_SET_PWRIDX                         169
-#define WLC_GET_TSSI                           170
-#define WLC_GET_SUP_RATESET_OVERRIDE           171
-#define WLC_SET_SUP_RATESET_OVERRIDE           172
-#define WLC_SET_FAST_TIMER                     173
-#define WLC_GET_FAST_TIMER                     174
-#define WLC_SET_SLOW_TIMER                     175
-#define WLC_GET_SLOW_TIMER                     176
-#define WLC_DUMP_PHYREGS                       177
-#define WLC_GET_GMODE_PROTECTION_CONTROL       178
-#define WLC_SET_GMODE_PROTECTION_CONTROL       179
+#define WLC_GET_PROTECTION_CONTROL             178
+#define WLC_SET_PROTECTION_CONTROL             179
 #define WLC_GET_PHYLIST                                180
-#define WLC_ENCRYPT_STRENGTH                   181     /* ndis only */
-#define WLC_DECRYPT_STATUS                     182     /* ndis only */
 #define WLC_GET_KEY_SEQ                                183
-#define WLC_GET_SCAN_CHANNEL_TIME              184
-#define WLC_SET_SCAN_CHANNEL_TIME              185
-#define WLC_GET_SCAN_UNASSOC_TIME              186
-#define WLC_SET_SCAN_UNASSOC_TIME              187
-#define WLC_GET_SCAN_HOME_TIME                 188
-#define WLC_SET_SCAN_HOME_TIME                 189
-#define WLC_GET_SCAN_PASSES                    190
-#define WLC_SET_SCAN_PASSES                    191
-#define WLC_GET_PRB_RESP_TIMEOUT               192
-#define WLC_SET_PRB_RESP_TIMEOUT               193
-#define WLC_GET_ATTEN                          194
-#define WLC_SET_ATTEN                          195
-#define WLC_GET_SHMEM                          196     /* diag */
-#define WLC_SET_SHMEM                          197     /* diag */
-#define WLC_GET_GMODE_PROTECTION_CTS           198
-#define WLC_SET_GMODE_PROTECTION_CTS           199
-#define WLC_SET_TKIP_MIC_FLAG                  200
-#define WLC_SCB_DEAUTHENTICATE_FOR_REASON      201
-#define WLC_TKIP_COUNTERMEASURES               202
+/* #define WLC_GET_GMODE_PROTECTION_CTS                198 */ /* no longer supported */
+/* #define WLC_SET_GMODE_PROTECTION_CTS                199 */ /* no longer supported */
 #define WLC_GET_PIOMODE                                203
 #define WLC_SET_PIOMODE                                204
 #define WLC_SET_LED                            209
 #define WLC_GET_LED                            210
-#define WLC_GET_INTERFERENCE_MODE              211
-#define WLC_SET_INTERFERENCE_MODE              212
-#define WLC_GET_CHANNEL_QA                     213
-#define WLC_START_CHANNEL_QA                   214
 #define WLC_GET_CHANNEL_SEL                    215
 #define WLC_START_CHANNEL_SEL                  216
 #define WLC_GET_VALID_CHANNELS                 217
 #define WLC_GET_FAKEFRAG                       218
 #define WLC_SET_FAKEFRAG                       219
-#define WLC_GET_PWROUT_PERCENTAGE              220
-#define WLC_SET_PWROUT_PERCENTAGE              221
-#define WLC_SET_BAD_FRAME_PREEMPT              222
-#define WLC_GET_BAD_FRAME_PREEMPT              223
-#define WLC_SET_LEAP_LIST                      224
-#define WLC_GET_LEAP_LIST                      225
-#define WLC_GET_CWMIN                          226
-#define WLC_SET_CWMIN                          227
-#define WLC_GET_CWMAX                          228
-#define WLC_SET_CWMAX                          229
 #define WLC_GET_WET                            230
 #define WLC_SET_WET                            231
 #define WLC_GET_KEY_PRIMARY                    235
 #define WLC_SET_KEY_PRIMARY                    236
-#define WLC_SCAN_WITH_CALLBACK                 240
-#define WLC_WDS_GET_REMOTE_HWADDR              246     /* currently handled in wl_linux.c/wl_vx.c */
+#define WLC_GET_RADAR                          242
+#define WLC_SET_RADAR                          243
+#define WLC_SET_SPECT_MANAGMENT                        244
+#define WLC_GET_SPECT_MANAGMENT                        245
+#define WLC_WDS_GET_REMOTE_HWADDR              246     /* handled in wl_linux.c/wl_vx.c */
 #define WLC_SET_CS_SCAN_TIMER                  248
 #define WLC_GET_CS_SCAN_TIMER                  249
+#define WLC_SEND_PWR_CONSTRAINT                        254
 #define WLC_CURRENT_PWR                                256
 #define WLC_GET_CHANNELS_IN_COUNTRY            260
 #define WLC_GET_COUNTRY_LIST                   261
 #define WLC_GET_VAR                            262     /* get value of named variable */
 #define WLC_SET_VAR                            263     /* set named variable to value */
-#define WLC_NVRAM_GET                          264
+#define WLC_NVRAM_GET                          264     /* deprecated */
 #define WLC_NVRAM_SET                          265
 #define WLC_SET_WSEC_PMK                       268
 #define WLC_GET_AUTH_MODE                      269
 #define WLC_SET_AUTH_MODE                      270
-#define WLC_LAST                               273     /* do not change - use get_var/set_var */
+#define WLC_NDCONFIG_ITEM                      273     /* currently handled in wl_oid.c */
+#define WLC_NVOTPW                             274
+#define WLC_OTPW                               275
+#define WLC_SET_LOCALE                         278
+#define WLC_LAST                               279     /* do not change - use get_var/set_var */
 
 /*
  * Minor kludge alert:
@@ -924,10 +792,7 @@ typedef struct wlc_rev_info {
 
 /* NDIS overrides */
 #define OID_WL_GETINSTANCE     (WL_OID_BASE + WLC_GET_INSTANCE)
-#define OID_WL_GET_FORCELINK   (WL_OID_BASE + WLC_GET_FORCELINK)
-#define OID_WL_SET_FORCELINK   (WL_OID_BASE + WLC_SET_FORCELINK)
-#define        OID_WL_ENCRYPT_STRENGTH (WL_OID_BASE + WLC_ENCRYPT_STRENGTH)
-#define OID_WL_DECRYPT_STATUS  (WL_OID_BASE + WLC_DECRYPT_STATUS)
+#define OID_WL_NDCONFIG_ITEM (WL_OID_BASE + WLC_NDCONFIG_ITEM)
 
 #define WL_DECRYPT_STATUS_SUCCESS      1
 #define WL_DECRYPT_STATUS_FAILURE      2
@@ -937,113 +802,205 @@ typedef struct wlc_rev_info {
 #define WLC_UPGRADE_SUCCESS                    0
 #define WLC_UPGRADE_PENDING                    1
 
+#ifdef CONFIG_USBRNDIS_RETAIL
+/* struct passed in for WLC_NDCONFIG_ITEM */
+typedef struct {
+       char *name;
+       void *param;
+} ndconfig_item_t;
+#endif
+
 /* Bit masks for radio disabled status - returned by WL_GET_RADIO */
-#define WL_RADIO_SW_DISABLE    (1<<0)
-#define WL_RADIO_HW_DISABLE    (1<<1)
+#define WL_RADIO_SW_DISABLE            (1<<0)
+#define WL_RADIO_HW_DISABLE            (1<<1)
+#define WL_RADIO_MPC_DISABLE           (1<<2)
+#define WL_RADIO_COUNTRY_DISABLE       (1<<3)  /* some countries don't support any channel */
 
 /* Override bit for WLC_SET_TXPWR.  if set, ignore other level limits */
 #define WL_TXPWR_OVERRIDE      (1<<31)
 
-
-/* Bus types */
-#define WL_SB_BUS      0       /* Silicon Backplane */
-#define WL_PCI_BUS     1       /* PCI target */
-#define WL_PCMCIA_BUS  2       /* PCMCIA target */
+/* "diag" iovar argument and error code */
+#define WL_DIAG_INTERRUPT                      1       /* d11 loopback interrupt test */
+#define WL_DIAG_MEMORY                         3       /* d11 memory test */
+#define WL_DIAG_LED                            4       /* LED test */
+#define WL_DIAG_REG                            5       /* d11/phy register test */
+#define WL_DIAG_SROM                           6       /* srom read/crc test */
+#define WL_DIAG_DMA                            7       /* DMA test */
+
+#define WL_DIAGERR_SUCCESS                     0
+#define WL_DIAGERR_FAIL_TO_RUN                 1       /* unable to run requested diag */
+#define WL_DIAGERR_NOT_SUPPORTED               2       /* diag requested is not supported */
+#define WL_DIAGERR_INTERRUPT_FAIL              3       /* loopback interrupt test failed */
+#define WL_DIAGERR_LOOPBACK_FAIL               4       /* loopback data test failed */
+#define WL_DIAGERR_SROM_FAIL                   5       /* srom read failed */
+#define WL_DIAGERR_SROM_BADCRC                 6       /* srom crc failed */
+#define WL_DIAGERR_REG_FAIL                    7       /* d11/phy register test failed */
+#define WL_DIAGERR_MEMORY_FAIL                 8       /* d11 memory test failed */
+#define WL_DIAGERR_NOMEM                       9       /* diag test failed due to no memory */
+#define WL_DIAGERR_DMA_FAIL                    10      /* DMA test failed */
 
 /* band types */
 #define        WLC_BAND_AUTO           0       /* auto-select */
-#define        WLC_BAND_A              1       /* "a" band (5   Ghz) */
-#define        WLC_BAND_B              2       /* "b" band (2.4 Ghz) */
+#define        WLC_BAND_5G             1       /* 5 Ghz */
+#define        WLC_BAND_2G             2       /* 2.4 Ghz */
+#define        WLC_BAND_ALL            3       /* all bands */
+
+/* phy types (returned by WLC_GET_PHYTPE) */
+#define        WLC_PHY_TYPE_A          0
+#define        WLC_PHY_TYPE_B          1
+#define        WLC_PHY_TYPE_G          2
+#define        WLC_PHY_TYPE_N          4
+#define        WLC_PHY_TYPE_NULL       0xf
 
 /* MAC list modes */
 #define WLC_MACMODE_DISABLED   0       /* MAC list disabled */
 #define WLC_MACMODE_DENY       1       /* Deny specified (i.e. allow unspecified) */
-#define WLC_MACMODE_ALLOW      2       /* Allow specified (i.e. deny unspecified) */   
-
-
-/* 54g modes (basic bits may still be overridden) */
-#define GMODE_LEGACY_B         0       /* Rateset: 1b, 2b, 5.5, 11 */
-                                       /* Preamble: Long */
-                                       /* Shortslot: Off */
-#define GMODE_AUTO             1       /* Rateset: 1b, 2b, 5.5b, 11b, 18, 24, 36, 54 */
-                                       /* Extended Rateset: 6, 9, 12, 48 */
-                                       /* Preamble: Long */
-                                       /* Shortslot: Auto */
-#define GMODE_ONLY             2       /* Rateset: 1b, 2b, 5.5b, 11b, 18, 24b, 36, 54 */
-                                       /* Extended Rateset: 6b, 9, 12b, 48 */
-                                       /* Preamble: Short required */
-                                       /* Shortslot: Auto */
-#define GMODE_B_DEFERRED       3       /* Rateset: 1b, 2b, 5.5b, 11b, 18, 24, 36, 54 */
-                                       /* Extended Rateset: 6, 9, 12, 48 */
-                                       /* Preamble: Long */
-                                       /* Shortslot: On */
-#define GMODE_PERFORMANCE      4       /* Rateset: 1b, 2b, 5.5b, 6b, 9, 11b, 12b, 18, 24b, 36, 48, 54 */
-                                       /* Preamble: Short required */
-                                       /* Shortslot: On and required */
-#define GMODE_LRS              5       /* Rateset: 1b, 2b, 5.5b, 11b */
-                                       /* Extended Rateset: 6, 9, 12, 18, 24, 36, 48, 54 */
-                                       /* Preamble: Long */
-                                       /* Shortslot: Auto */
-#define GMODE_MAX              6
+#define WLC_MACMODE_ALLOW      2       /* Allow specified (i.e. deny unspecified) */
 
+/*
+ *
+ */
+#define GMODE_LEGACY_B         0
+#define GMODE_AUTO             1
+#define GMODE_ONLY             2
+#define GMODE_B_DEFERRED       3
+#define GMODE_PERFORMANCE      4
+#define GMODE_LRS              5
+#define GMODE_MAX              6
 
 /* values for PLCPHdr_override */
 #define WLC_PLCP_AUTO  -1
 #define WLC_PLCP_SHORT 0
 #define WLC_PLCP_LONG  1
 
-/* values for g_protection_override */
-#define WLC_G_PROTECTION_AUTO  -1
-#define WLC_G_PROTECTION_OFF   0
-#define WLC_G_PROTECTION_ON    1
+/* values for g_protection_override and n_protection_override */
+#define WLC_PROTECTION_AUTO            -1
+#define WLC_PROTECTION_OFF             0
+#define WLC_PROTECTION_ON              1
+
+/* values for g_protection_control and n_protection_control */
+#define WLC_PROTECTION_CTL_OFF         0
+#define WLC_PROTECTION_CTL_LOCAL       1
+#define WLC_PROTECTION_CTL_OVERLAP     2
+
+/* deprecated const names for g_protection_override */
+#define WLC_G_PROTECTION_AUTO          WLC_PROTECTION_AUTO
+#define WLC_G_PROTECTION_OFF           WLC_PROTECTION_OFF
+#define WLC_G_PROTECTION_ON            WLC_PROTECTION_ON
 
-/* values for g_protection_control */
-#define WLC_G_PROTECTION_CTL_OFF       0
-#define WLC_G_PROTECTION_CTL_LOCAL     1
-#define WLC_G_PROTECTION_CTL_OVERLAP   2
+/* deprecated const names for g_protection_control */
+#define WLC_G_PROTECTION_CTL_OFF       WLC_PROTECTION_CTL_OFF
+#define WLC_G_PROTECTION_CTL_LOCAL     WLC_PROTECTION_CTL_LOCAL
+#define WLC_G_PROTECTION_CTL_OVERLAP   WLC_PROTECTION_CTL_OVERLAP
+
+/* deprecated const names for get/set g_protection_control */
+#define WLC_GET_GMODE_PROTECTION_CONTROL       WLC_GET_PROTECTION_CONTROL
+#define WLC_SET_GMODE_PROTECTION_CONTROL       WLC_SET_PROTECTION_CONTROL
+
+/* values for n_protection */
+#define WLC_N_PROTECTION_OFF           0
+#define WLC_N_PROTECTION_MIXEDMODE     1
+#define WLC_N_PROTECTION_CTS           2
+
+/* values for n_preamble_type */
+#define WLC_N_PREAMBLE_MIXEDMODE       0
+#define WLC_N_PREAMBLE_GF              1
 
 /* Values for PM */
 #define PM_OFF 0
 #define PM_MAX 1
 #define PM_FAST 2
 
-/* interference mitigation options */
-#define        INTERFERE_NONE  0       /* off */
-#define        NON_WLAN        1       /* foreign/non 802.11 interference, no auto detect */
-#define        WLAN_MANUAL     2       /* ACI: no auto detection */
-#define        WLAN_AUTO       3       /* ACI: auto - detact */
-
-/* Message levels */
-#define WL_ERROR_VAL           0x0001
-#define WL_TRACE_VAL           0x0002
-#define WL_PRHDRS_VAL          0x0004
-#define WL_PRPKT_VAL           0x0008
-#define WL_INFORM_VAL          0x0010
-#define WL_TMP_VAL             0x0020
-#define WL_OID_VAL             0x0040
-#define WL_RATE_VAL            0x0080
-#define WL_ASSOC_VAL           0x0100
-#define WL_PRUSR_VAL           0x0200
-#define WL_PS_VAL              0x0400
-#define WL_TXPWR_VAL           0x0800
-#define WL_GMODE_VAL           0x1000
-#define WL_DUAL_VAL            0x2000
-#define WL_WSEC_VAL            0x4000
-#define WL_WSEC_DUMP_VAL       0x8000
-#define WL_LOG_VAL             0x10000
-#define WL_NRSSI_VAL           0x20000
-#define WL_LOFT_VAL            0x40000
-#define WL_REGULATORY_VAL      0x80000
-#define WL_ACI_VAL             0x100000
-
-
-/* 802.11h enforcement levels */
-#define SPECT_MNGMT_OFF         0   /* 11h disabled */
-#define SPECT_MNGMT_LOOSE       1   /* Allow scan lists to contain non-11h AP */
-                                   /* when 11h is enabled */
-#define SPECT_MNGMT_STRICT      2   /* Prine out non-11h APs from scan list */
 
 
+typedef struct {
+       int npulses;    /* required number of pulses at n * t_int */
+       int ncontig;    /* required number of pulses at t_int */
+       int min_pw;     /* minimum pulse width (20 MHz clocks) */
+       int max_pw;     /* maximum pulse width (20 MHz clocks) */
+       uint16 thresh0; /* Radar detection, thresh 0 */
+       uint16 thresh1; /* Radar detection, thresh 1 */
+       int npulses_lp;  /* Radar detection, minimum long pulses */
+       int min_pw_lp; /* Minimum pulsewidth for long pulses */
+       int max_pw_lp; /* Maximum pulsewidth for long pulses */
+       int min_fm_lp; /* Minimum fm for long pulses */
+       int max_deltat_lp;  /* Maximum deltat for long pulses */
+       int min_deltat; /* Minimum spacing between pulses */
+} wl_radar_args_t;
+
+/* radar iovar SET defines */
+#define WL_RADAR_DETECTOR_OFF          0       /* radar detector off */
+#define WL_RADAR_DETECTOR_ON           1       /* radar detector on */
+#define WL_RADAR_SIMULATED             2       /* force radar detector to declare
+                                                * detection once
+                                                */
+
+/* dfs_status iovar-related defines */
+
+/* cac - channel availability check,
+ * ism - in-service monitoring
+ * csa - channel switching announcement
+ */
+
+/* cac state values */
+#define WL_DFS_CACSTATE_IDLE           0       /* state for operating in non-radar channel */
+#define        WL_DFS_CACSTATE_PREISM_CAC      1       /* CAC in progress */
+#define WL_DFS_CACSTATE_ISM            2       /* ISM in progress */
+#define WL_DFS_CACSTATE_CSA            3       /* csa */
+#define WL_DFS_CACSTATE_POSTISM_CAC    4       /* ISM CAC */
+#define WL_DFS_CACSTATE_PREISM_OOC     5       /* PREISM OOC */
+#define WL_DFS_CACSTATE_POSTISM_OOC    6       /* POSTISM OOC */
+#define WL_DFS_CACSTATES               7       /* this many states exist */
+
+/* data structure used in 'dfs_status' wl interface, which is used to query dfs status */
+typedef struct {
+       uint state;             /* noted by WL_DFS_CACSTATE_XX. */
+       uint duration;          /* time spent in ms in state. */
+       /* as dfs enters ISM state, it removes the operational channel from quiet channel
+        * list and notes the channel in channel_cleared. set to 0 if no channel is cleared
+        */
+       chanspec_t chanspec_cleared;
+       /* chanspec cleared used to be a uint, add another to uint16 to maintain size */
+       uint16 pad;
+} wl_dfs_status_t;
+
+#define NUM_PWRCTRL_RATES 12
+
+typedef struct tx_inst_power {
+} tx_inst_power_t;
+
+
+/* regulatory enforcement levels */
+#define SPECT_MNGMT_OFF                        0               /* both 11h and 11d disabled */
+#define SPECT_MNGMT_LOOSE_11H          1               /* allow non-11h APs in scan lists */
+#define SPECT_MNGMT_STRICT_11H         2               /* prune out non-11h APs from scan list */
+#define SPECT_MNGMT_STRICT_11D         3               /* switch to 802.11D mode */
+/* SPECT_MNGMT_LOOSE_11H_D - same as SPECT_MNGMT_LOOSE with the exception that Country IE
+ * adoption is done irregardless of capability-spectrum_management
+ */
+#define SPECT_MNGMT_LOOSE_11H_D                4               /* operation defined above */
+
+#define WL_CHAN_VALID_HW       (1 << 0)        /* valid with current HW */
+#define WL_CHAN_VALID_SW       (1 << 1)        /* valid with current country setting */
+#define WL_CHAN_BAND_5G                (1 << 2)        /* 5GHz-band channel */
+#define WL_CHAN_RADAR          (1 << 3)        /* radar sensitive  channel */
+#define WL_CHAN_INACTIVE       (1 << 4)        /* temporarily inactive due to radar */
+#define WL_CHAN_PASSIVE                (1 << 5)        /* channel is in passive mode */
+#define WL_CHAN_RESTRICTED     (1 << 6)        /* restricted use channel */
+
+/* BTC mode used by "btc_mode" iovar */
+#define        WL_BTC_DISABLE          0       /* disable BT coexistance */
+#define WL_BTC_ENABLE          1       /* enable BT coexistance */
+#define WL_BTC_PREMPT          2       /* enable BT coexistance and BT pre-emption */
+
+#define WL_MPC_VAL             0x00400000
+#define WL_APSTA_VAL           0x00800000
+#define WL_DFS_VAL             0x01000000
+#define WL_BA_VAL              0x02000000
+#define WL_NITRO_VAL           0x04000000
+#define WL_CAC_VAL             0x08000000
+#define WL_AMSDU_VAL           0x10000000
+#define WL_AMPDU_VAL           0x20000000
 
 /* max # of leds supported by GPIO (gpio pin# == led index#) */
 #define        WL_LED_NUMGPIO          16      /* gpio 0-15 */
@@ -1067,28 +1024,361 @@ typedef struct wlc_rev_info {
 #define        WL_LED_BEH_MASK         0x7f            /* behavior mask */
 #define        WL_LED_AL_MASK          0x80            /* activelow (polarity) bit */
 
-
-/* maximum channels */
-#define WL_NUMCHANNELS 64      /* max # of channels in the band */
-
-/* rate check */
-#define WL_RATE_OFDM(r)                (((r) & 0x7f) == 12 || ((r) & 0x7f) == 18 || \
-                                ((r) & 0x7f) == 24 || ((r) & 0x7f) == 36 || \
-                                ((r) & 0x7f) == 48 || ((r) & 0x7f) == 72 || \
-                                ((r) & 0x7f) == 96 || ((r) & 0x7f) == 108)
+/* max # of channels returnd by the get valid channels iovar */
+#define WL_NUMCHANSPECS                100
 
 /* WDS link local endpoint WPA role */
 #define WL_WDS_WPA_ROLE_AUTH   0       /* authenticator */
 #define WL_WDS_WPA_ROLE_SUP    1       /* supplicant */
 #define WL_WDS_WPA_ROLE_AUTO   255     /* auto, based on mac addr value */
 
-/* afterburner_override */
-#define        ABO_AUTO                -1      /* auto - no override */
-#define        ABO_OFF                 0       /* force afterburner off */
-#define        ABO_ON                  1       /* force afterburner on */
+/* number of bytes needed to define a 128-bit mask for MAC event reporting */
+#define WL_EVENTING_MASK_LEN   16
+
+/* Structures and constants used for "vndr_ie" IOVar interface */
+#define VNDR_IE_CMD_LEN                4       /* length of the set command string:
+                                        * "add", "del" (+ NULL)
+                                        */
+
+/* 802.11 Mgmt Packet flags */
+#define VNDR_IE_BEACON_FLAG    0x1
+#define VNDR_IE_PRBRSP_FLAG    0x2
+#define VNDR_IE_ASSOCRSP_FLAG  0x4
+#define VNDR_IE_AUTHRSP_FLAG   0x8
+
+#define VNDR_IE_INFO_HDR_LEN   (sizeof(uint32))
+
+typedef struct {
+       uint32 pktflag;                 /* bitmask indicating which packet(s) contain this IE */
+       vndr_ie_t vndr_ie_data;         /* vendor IE data */
+} vndr_ie_info_t;
+
+typedef struct {
+       int iecount;                    /* number of entries in the vndr_ie_list[] array */
+       vndr_ie_info_t vndr_ie_list[1]; /* variable size list of vndr_ie_info_t structs */
+} vndr_ie_buf_t;
+
+typedef struct {
+       char cmd[VNDR_IE_CMD_LEN];      /* vndr_ie IOVar set command : "add", "del" + NULL */
+       vndr_ie_buf_t vndr_ie_buffer;   /* buffer containing Vendor IE list information */
+} vndr_ie_setbuf_t;
+
+/* join target preference types */
+#define WL_JOIN_PREF_RSSI      1       /* by RSSI, mandatory */
+#define WL_JOIN_PREF_WPA       2       /* by akm and ciphers, optional, RSN and WPA as values */
+#define WL_JOIN_PREF_BAND      3       /* by 802.11 band, optional, WLC_BAND_XXXX as values */
 
-#define GMODE_AFTERBURNER 6
+/* band preference */
+#define WLJP_BAND_ASSOC_PREF   255     /* use assoc preference settings */
+                                       /* others use WLC_BAND_XXXX as values */
+
+/* any multicast cipher suite */
+#define WL_WPA_ACP_MCS_ANY     "\x00\x00\x00\x00"
+
+struct tsinfo_arg {
+       uint8 octets[3];
+};
+
+#if !defined(__GNUC__)
+#pragma pack(pop)
+#endif
+
+#define        NFIFO                   6       /* # tx/rx fifopairs */
+
+#define        WL_CNT_T_VERSION        1       /* current version of wl_cnt_t struct */
+
+typedef struct {
+       uint16  version;        /* see definition of WL_CNT_T_VERSION */
+       uint16  length;         /* length of entire structure */
+
+       /* transmit stat counters */
+       uint32  txframe;        /* tx data frames */
+       uint32  txbyte;         /* tx data bytes */
+       uint32  txretrans;      /* tx mac retransmits */
+       uint32  txerror;        /* tx data errors (derived: sum of others) */
+       uint32  txctl;          /* tx management frames */
+       uint32  txprshort;      /* tx short preamble frames */
+       uint32  txserr;         /* tx status errors */
+       uint32  txnobuf;        /* tx out of buffers errors */
+       uint32  txnoassoc;      /* tx discard because we're not associated */
+       uint32  txrunt;         /* tx runt frames */
+       uint32  txchit;         /* tx header cache hit (fastpath) */
+       uint32  txcmiss;        /* tx header cache miss (slowpath) */
+
+       /* transmit chip error counters */
+       uint32  txuflo;         /* tx fifo underflows */
+       uint32  txphyerr;       /* tx phy errors (indicated in tx status) */
+       uint32  txphycrs;       
+
+       /* receive stat counters */
+       uint32  rxframe;        /* rx data frames */
+       uint32  rxbyte;         /* rx data bytes */
+       uint32  rxerror;        /* rx data errors (derived: sum of others) */
+       uint32  rxctl;          /* rx management frames */
+       uint32  rxnobuf;        /* rx out of buffers errors */
+       uint32  rxnondata;      /* rx non data frames in the data channel errors */
+       uint32  rxbadds;        /* rx bad DS errors */
+       uint32  rxbadcm;        /* rx bad control or management frames */
+       uint32  rxfragerr;      /* rx fragmentation errors */
+       uint32  rxrunt;         /* rx runt frames */
+       uint32  rxgiant;        /* rx giant frames */
+       uint32  rxnoscb;        /* rx no scb error */
+       uint32  rxbadproto;     /* rx invalid frames */
+       uint32  rxbadsrcmac;    /* rx frames with Invalid Src Mac */
+       uint32  rxbadda;        /* rx frames tossed for invalid da */
+       uint32  rxfilter;       /* rx frames filtered out */
+
+       /* receive chip error counters */
+       uint32  rxoflo;         /* rx fifo overflow errors */
+       uint32  rxuflo[NFIFO];  /* rx dma descriptor underflow errors */
+
+       uint32  d11cnt_txrts_off;       /* d11cnt txrts value when reset d11cnt */
+       uint32  d11cnt_rxcrc_off;       /* d11cnt rxcrc value when reset d11cnt */
+       uint32  d11cnt_txnocts_off;     /* d11cnt txnocts value when reset d11cnt */
+
+       /* misc counters */
+       uint32  dmade;          /* tx/rx dma descriptor errors */
+       uint32  dmada;          /* tx/rx dma data errors */
+       uint32  dmape;          /* tx/rx dma descriptor protocol errors */
+       uint32  reset;          /* reset count */
+       uint32  tbtt;           /* cnts the TBTT int's */
+       uint32  txdmawar;       
+       uint32  pkt_callback_reg_fail;  /* callbacks register failure */
+
+       /* MAC counters: 32-bit version of d11.h's macstat_t */
+       uint32  txallfrm;       /* total number of frames sent, incl. Data, ACK, RTS, CTS,
+                                * Control Management (includes retransmissions)
+                                */
+       uint32  txrtsfrm;       /* number of RTS sent out by the MAC */
+       uint32  txctsfrm;       /* number of CTS sent out by the MAC */
+       uint32  txackfrm;       /* number of ACK frames sent out */
+       uint32  txdnlfrm;       /* Not used */
+       uint32  txbcnfrm;       /* beacons transmitted */
+       uint32  txfunfl[8];     /* per-fifo tx underflows */
+       uint32  txtplunfl;      /* Template underflows (mac was too slow to transmit ACK/CTS
+                                * or BCN)
+                                */
+       uint32  txphyerror;     /* Transmit phy error, type of error is reported in tx-status for
+                                * driver enqueued frames
+                                */
+       uint32  rxfrmtoolong;   /* Received frame longer than legal limit (2346 bytes) */
+       uint32  rxfrmtooshrt;   /* Received frame did not contain enough bytes for its frame type */
+       uint32  rxinvmachdr;    /* Either the protocol version != 0 or frame type not
+                                * data/control/management
+                                */
+       uint32  rxbadfcs;       /* number of frames for which the CRC check failed in the MAC */
+       uint32  rxbadplcp;      /* parity check of the PLCP header failed */
+       uint32  rxcrsglitch;    /* PHY was able to correlate the preamble but not the header */
+       uint32  rxstrt;         /* Number of received frames with a good PLCP
+                                * (i.e. passing parity check)
+                                */
+       uint32  rxdfrmucastmbss; /* Number of received DATA frames with good FCS and matching RA */
+       uint32  rxmfrmucastmbss; /* number of received mgmt frames with good FCS and matching RA */
+       uint32  rxcfrmucast;    /* number of received CNTRL frames with good FCS and matching RA */
+       uint32  rxrtsucast;     /* number of unicast RTS addressed to the MAC (good FCS) */
+       uint32  rxctsucast;     /* number of unicast CTS addressed to the MAC (good FCS) */
+       uint32  rxackucast;     /* number of ucast ACKS received (good FCS) */
+       uint32  rxdfrmocast;    /* number of received DATA frames (good FCS and not matching RA) */
+       uint32  rxmfrmocast;    /* number of received MGMT frames (good FCS and not matching RA) */
+       uint32  rxcfrmocast;    /* number of received CNTRL frame (good FCS and not matching RA) */
+       uint32  rxrtsocast;     /* number of received RTS not addressed to the MAC */
+       uint32  rxctsocast;     /* number of received CTS not addressed to the MAC */
+       uint32  rxdfrmmcast;    /* number of RX Data multicast frames received by the MAC */
+       uint32  rxmfrmmcast;    /* number of RX Management multicast frames received by the MAC */
+       uint32  rxcfrmmcast;    /* number of RX Control multicast frames received by the MAC
+                                * (unlikely to see these)
+                                */
+       uint32  rxbeaconmbss;   /* beacons received from member of BSS */
+       uint32  rxdfrmucastobss; /* number of unicast frames addressed to the MAC from
+                                 * other BSS (WDS FRAME)
+                                 */
+       uint32  rxbeaconobss;   /* beacons received from other BSS */
+       uint32  rxrsptmout;     /* Number of response timeouts for transmitted frames
+                                * expecting a response
+                                */
+       uint32  bcntxcancl;     /* transmit beacons canceled due to receipt of beacon (IBSS) */
+       uint32  rxf0ovfl;       /* Number of receive fifo 0 overflows */
+       uint32  rxf1ovfl;       /* Number of receive fifo 1 overflows (obsolete) */
+       uint32  rxf2ovfl;       /* Number of receive fifo 2 overflows (obsolete) */
+       uint32  txsfovfl;       /* Number of transmit status fifo overflows (obsolete) */
+       uint32  pmqovfl;        /* Number of PMQ overflows */
+       uint32  rxcgprqfrm;     /* Number of received Probe requests that made it into
+                                * the PRQ fifo
+                                */
+       uint32  rxcgprsqovfl;   /* Rx Probe Request Que overflow in the AP */
+       uint32  txcgprsfail;    /* Tx Probe Response Fail. AP sent probe response but did
+                                * not get ACK
+                                */
+       uint32  txcgprssuc;     /* Tx Probe Response Success (ACK was received) */
+       uint32  prs_timeout;    /* Number of probe requests that were dropped from the PRQ
+                                * fifo because a probe response could not be sent out within
+                                * the time limit defined in M_PRS_MAXTIME
+                                */
+       uint32  rxnack;         /* Number of NACKS received (Afterburner) */
+       uint32  frmscons;       /* Number of frames completed without transmission because of an
+                                * Afterburner re-queue
+                                */
+       uint32  txnack;         /* Number of NACKs transmitted (Afterburner) */
+       uint32  txglitch_nack;  /* obsolete */
+       uint32  txburst;        /* obsolete */
+
+       /* 802.11 MIB counters, pp. 614 of 802.11 reaff doc. */
+       uint32  txfrag;         /* dot11TransmittedFragmentCount */
+       uint32  txmulti;        /* dot11MulticastTransmittedFrameCount */
+       uint32  txfail;         /* dot11FailedCount */
+       uint32  txretry;        /* dot11RetryCount */
+       uint32  txretrie;       /* dot11MultipleRetryCount */
+       uint32  rxdup;          /* dot11FrameduplicateCount */
+       uint32  txrts;          /* dot11RTSSuccessCount */
+       uint32  txnocts;        /* dot11RTSFailureCount */
+       uint32  txnoack;        /* dot11ACKFailureCount */
+       uint32  rxfrag;         /* dot11ReceivedFragmentCount */
+       uint32  rxmulti;        /* dot11MulticastReceivedFrameCount */
+       uint32  rxcrc;          /* dot11FCSErrorCount */
+       uint32  txfrmsnt;       /* dot11TransmittedFrameCount (bogus MIB?) */
+       uint32  rxundec;        /* dot11WEPUndecryptableCount */
+
+       /* WPA2 counters (see rxundec for DecryptFailureCount) */
+       uint32  tkipmicfaill;   /* TKIPLocalMICFailures */
+       uint32  tkipcntrmsr;    /* TKIPCounterMeasuresInvoked */
+       uint32  tkipreplay;     /* TKIPReplays */
+       uint32  ccmpfmterr;     /* CCMPFormatErrors */
+       uint32  ccmpreplay;     /* CCMPReplays */
+       uint32  ccmpundec;      /* CCMPDecryptErrors */
+       uint32  fourwayfail;    /* FourWayHandshakeFailures */
+       uint32  wepundec;       /* dot11WEPUndecryptableCount */
+       uint32  wepicverr;      /* dot11WEPICVErrorCount */
+       uint32  decsuccess;     /* DecryptSuccessCount */
+       uint32  tkipicverr;     /* TKIPICVErrorCount */
+       uint32  wepexcluded;    /* dot11WEPExcludedCount */
+
+       uint32  txchanrej;      /* Tx frames suppressed due to channel rejection */
+       uint32  psmwds;         /* Count PSM watchdogs */
+       uint32  phywatchdog;    /* Count Phy lockups */
+} wl_cnt_t;
+
+#define WL_WME_CNT_VERSION     1       /* current version of wl_wme_cnt_t */
+
+typedef struct {
+       uint32 packets;
+       uint32 bytes;
+} wl_traffic_stats_t;
+
+typedef struct {
+       uint16  version;        /* see definition of WL_CNT_T_VERSION */
+       uint16  length;         /* length of entire structure */
+
+       wl_traffic_stats_t tx[AC_COUNT];        /* Packets transmitted */
+       wl_traffic_stats_t tx_failed[AC_COUNT]; /* Packets dropped or failed to transmit */
+       wl_traffic_stats_t rx[AC_COUNT];        /* Packets received */
+       wl_traffic_stats_t rx_failed[AC_COUNT]; /* Packets failed to receive */
+
+       wl_traffic_stats_t forward[AC_COUNT];   /* Packets forwarded by AP */
+
+       wl_traffic_stats_t tx_expired[AC_COUNT];        /* packets dropped due to lifetime expiry */
+
+} wl_wme_cnt_t;
+
+#ifdef WLBA
+
+#define        WLC_BA_CNT_VERSION      1       /* current version of wlc_ba_cnt_t */
+
+/* block ack related stats */
+typedef struct wlc_ba_cnt {
+       uint16  version;        /* WLC_BA_CNT_VERSION */
+       uint16  length;         /* length of entire structure */
+
+       /* transmit stat counters */
+       uint32 txpdu;           /* pdus sent */
+       uint32 txsdu;           /* sdus sent */
+       uint32 txfc;            /* tx side flow controlled packets */
+       uint32 txfci;           /* tx side flow control initiated */
+       uint32 txretrans;       /* retransmitted pdus */
+       uint32 txbatimer;       /* ba resend due to timer */
+       uint32 txdrop;          /* dropped packets */
+       uint32 txaddbareq;      /* addba req sent */
+       uint32 txaddbaresp;     /* addba resp sent */
+       uint32 txdelba;         /* delba sent */
+       uint32 txba;            /* ba sent */
+       uint32 txbar;           /* bar sent */
+       uint32 txpad[4];        /* future */
+
+       /* receive side counters */
+       uint32 rxpdu;           /* pdus recd */
+       uint32 rxqed;           /* pdus buffered before sending up */
+       uint32 rxdup;           /* duplicate pdus */
+       uint32 rxnobuf;         /* pdus discarded due to no buf */
+       uint32 rxaddbareq;      /* addba req recd */
+       uint32 rxaddbaresp;     /* addba resp recd */
+       uint32 rxdelba;         /* delba recd */
+       uint32 rxba;            /* ba recd */
+       uint32 rxbar;           /* bar recd */
+       uint32 rxinvba;         /* invalid ba recd */
+       uint32 rxbaholes;       /* ba recd with holes */
+       uint32 rxunexp;         /* unexpected packets */
+       uint32 rxpad[4];        /* future */
+} wlc_ba_cnt_t;
+#endif /* WLBA */
+
+/* structure for per-tid ampdu control */
+struct ampdu_tid_control {
+       uint8 tid;                      /* tid */
+       uint8 enable;                   /* enable/disable */
+};
+
+/* structure for addts arguments */
+/* For ioctls that take a list of TSPEC */
+struct tslist {
+       int count;                      /* number of tspecs */
+       struct tsinfo_arg tsinfo[1];    /* variable length array of tsinfo */
+};
 
-#undef PACKED
+/* structure for addts/delts arguments */
+typedef struct tspec_arg {
+       uint16 version;                 /* see definition of TSPEC_ARG_VERSION */
+       uint16 length;                  /* length of entire structure */
+       uint flag;                      /* bit field */
+       /* TSPEC Arguments */
+       struct tsinfo_arg tsinfo;       /* TS Info bit field */
+       uint16 nom_msdu_size;           /* (Nominal or fixed) MSDU Size (bytes) */
+       uint16 max_msdu_size;           /* Maximum MSDU Size (bytes) */
+       uint min_srv_interval;          /* Minimum Service Interval (us) */
+       uint max_srv_interval;          /* Maximum Service Interval (us) */
+       uint inactivity_interval;       /* Inactivity Interval (us) */
+       uint suspension_interval;       /* Suspension Interval (us) */
+       uint srv_start_time;            /* Service Start Time (us) */
+       uint min_data_rate;             /* Minimum Data Rate (bps) */
+       uint mean_data_rate;            /* Mean Data Rate (bps) */
+       uint peak_data_rate;            /* Peak Data Rate (bps) */
+       uint max_burst_size;            /* Maximum Burst Size (bytes) */
+       uint delay_bound;               /* Delay Bound (us) */
+       uint min_phy_rate;              /* Minimum PHY Rate (bps) */
+       uint16 surplus_bw;              /* Surplus Bandwidth Allowance Factor */
+       uint16 medium_time;             /* Medium Time (32 us/s periods) */
+} tspec_arg_t;
+
+/* current version of wl_tspec_arg_t struct */
+#define        TSPEC_ARG_VERSION       1       /* current version of wl_tspec_arg_t struct */
+#define TSPEC_ARG_LENGTH       55      /* argment length from tsinfo to medium_time */
+
+/* define for flag */
+#define TSPEC_PENDING          0       /* TSPEC pending */
+#define TSPEC_ACCEPTED         1       /* TSPEC accepted */
+#define TSPEC_REJECTED         2       /* TSPEC rejected */
+#define TSPEC_UNKNOWN          3       /* TSPEC unknown */
+#define TSPEC_STATUS_MASK      7       /* TSPEC status mask */
+
+
+/* Software feature flag defines used by wlfeatureflag */
+#define WL_SWFL_ABBFL          0x0001 /* Allow Afterburner on systems w/o hardware BFL */
+#define WL_SWFL_ABENCORE       0x0002 /* Allow AB on non-4318E chips */
+
+#define WL_LIFETIME_MAX 0xFFFF /* Max value in ms */
+
+/* Packet lifetime configuration per ac */
+typedef struct wl_lifetime {
+       uint32 ac;              /* access class */
+       uint32 lifetime;    /* Packet lifetime value in ms */
+} wl_lifetime_t;
 
 #endif /* _wlioctl_h_ */
index 07e2536ca3c473b4a4caa1f412831b164a7750ac..898fb29fb7b9fe572eb8e760cbc336f295844143 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Broadcom wireless network adapter utility functions
  *
- * Copyright 2004, Broadcom Corporation
+ * Copyright 2006, Broadcom Corporation
  * All Rights Reserved.
  * 
  * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
  */
 extern int wl_ioctl(char *name, int cmd, void *buf, int len);
 
-/*
- * Get the MAC (hardware) address of the specified interface.
- * @param      name    interface name
- * @param      hwaddr  6-byte buffer for receiving address
- * @return     >= 0 if successful or < 0 otherwise
- */
-extern int wl_hwaddr(char *name, unsigned char *hwaddr);
-
 /*
  * Probe the specified interface.
  * @param      name    interface name
@@ -43,17 +35,68 @@ extern int wl_hwaddr(char *name, unsigned char *hwaddr);
  */
 extern int wl_probe(char *name);
 
+extern int wl_iovar_set(char *ifname, char *iovar, void *param, int paramlen);
+extern int wl_iovar_get(char *ifname, char *iovar, void *bufptr, int buflen);
 /*
  * Set/Get named variable.
- * @param      name    interface name
- * @param      var     variable name
- * @param      val     variable value/buffer
- * @param      len     variable value/buffer length
+ * @param      ifname          interface name
+ * @param      iovar           variable name
+ * @param      param           input param value/buffer
+ * @param      paramlen        input param value/buffer length
+ * @param      bufptr          io buffer
+ * @param      buflen          io buffer length
+ * @param      val             val or val pointer for int routines
+ * @return     success == 0, failure != 0
+ */
+/*
+ * set named driver variable to int value
+ * calling example: wl_iovar_setint(ifname, "arate", rate)
+*/
+static inline int
+wl_iovar_setint(char *ifname, char *iovar, int val)
+{
+       return wl_iovar_set(ifname, iovar, &val, sizeof(val));
+}
+
+/*
+ * get named driver variable to int value and return error indication
+ * calling example: wl_iovar_getint(ifname, "arate", &rate)
+ */
+static inline int
+wl_iovar_getint(char *ifname, char *iovar, int *val)
+{
+       return wl_iovar_get(ifname, iovar, val, sizeof(int));
+}
+
+/*
+ * Set/Get named variable indexed by BSS Configuration
+ * @param      ifname          interface name
+ * @param      iovar           variable name
+ * @param      bssidx          bsscfg index
+ * @param      param           input param value/buffer
+ * @param      paramlen        input param value/buffer length
+ * @param      bufptr          io buffer
+ * @param      buflen          io buffer length
+ * @param      val             val or val pointer for int routines
  * @return     success == 0, failure != 0
  */
-extern int wl_set_val(char *name, char *var, void *val, int len);
-extern int wl_get_val(char *name, char *var, void *val, int len);
-extern int wl_set_int(char *name, char *var, int val);
-extern int wl_get_int(char *name, char *var, int *val);
+extern int wl_bssiovar_get(char *ifname, char *iovar, int bssidx, void *outbuf, int len);
+extern int wl_bssiovar_set(char *ifname, char *iovar, int bssidx, void *param, int paramlen);
+/*
+ * set named & bss indexed driver variable to int value
+ */
+static inline int
+wl_bssiovar_setint(char *ifname, char *iovar, int bssidx, int val)
+{
+       return wl_bssiovar_set(ifname, iovar, bssidx, &val, sizeof(int));
+}
+
+static inline int
+wl_bssiovar_getint(char *ifname, char *iovar, int bssidx, int *val)
+{
+       return wl_bssiovar_get(ifname, iovar, bssidx, val, sizeof(int));
+}
+
+extern int wl_bssiovar_setint(char *ifname, char *iovar, int bssidx, int val);
 
 #endif /* _wlutils_h_ */
index 625da6a3a4cf2e7541c800361ca3b3b4fc128b21..d849be855f8818a15700f9ab065c4c886a01e376 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * wlcompat.c
  *
- * Copyright (C) 2005 Mike Baker,
- *                    Felix Fietkau <openwrt@nbd.name>
+ * Copyright (C) 2005      Mike Baker
+ * Copyright (C) 2005-2007 Felix Fietkau <nbd@openwrt.org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 #include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/if_arp.h>
-#include <asm/uaccess.h>
 #include <linux/wireless.h>
 #include <linux/timer.h>
-
+#include <linux/delay.h>
 #include <net/iw_handler.h>
+#include <asm/uaccess.h>
+
+#include <typedefs.h>
+#include <bcmutils.h>
 #include <wlioctl.h>
-#include <proto/802.11.h>
 
 static struct net_device *dev;
-static unsigned short bss_force;
 static struct iw_statistics wstats;
+#ifndef DEBUG
 static int random = 1;
+#endif
+static int last_mode = -1;
+static int scan_cur = 0;
 char buf[WLC_IOCTL_MAXLEN];
 
 /* The frequency of each channel in MHz */
@@ -48,7 +53,8 @@ const long channel_frequency[] = {
 };
 #define NUM_CHANNELS ( sizeof(channel_frequency) / sizeof(channel_frequency[0]) )
 
-#define RNG_POLL_FREQ  2
+#define SCAN_RETRY_MAX 5
+#define RNG_POLL_FREQ  1
 
 typedef struct internal_wsec_key {
        uint8 index;            // 0x00
@@ -61,10 +67,6 @@ typedef struct internal_wsec_key {
 } wkey;
 
 
-static int wlcompat_private_ioctl(struct net_device *dev,
-                        struct iw_request_info *info,
-                        union iwreq_data *wrqu,
-                        char *extra);
 #ifdef DEBUG
 void print_buffer(int len, unsigned char *buf);
 #endif
@@ -86,45 +88,187 @@ static int wl_ioctl(struct net_device *dev, int cmd, void *buf, int len)
        return ret;
 }
 
-static int wl_set_val(struct net_device *dev, char *var, void *val, int len)
+static int
+wl_iovar_getbuf(struct net_device *dev, char *iovar, void *param, int paramlen, void *bufptr, int buflen)
 {
-       char buf[128];
-       int buf_len;
-       int ret;
+       int err;
+       uint namelen;
+       uint iolen;
+
+       namelen = strlen(iovar) + 1;     /* length of iovar name plus null */
+       iolen = namelen + paramlen;
 
        /* check for overflow */
-       if ((buf_len = strlen(var)) + 1 + len > sizeof(buf))
-               return -1;
-       
-       strcpy(buf, var);
-       buf_len += 1;
+       if (iolen > buflen)
+               return (BCME_BUFTOOSHORT);
 
-       /* append int value onto the end of the name string */
-       memcpy(&(buf[buf_len]), val, len);
-       buf_len += len;
+       memcpy(bufptr, iovar, namelen); /* copy iovar name including null */
+       memcpy((int8*)bufptr + namelen, param, paramlen);
 
-       ret = wl_ioctl(dev, WLC_SET_VAR, buf, buf_len);
-       return ret;
+       err = wl_ioctl(dev, WLC_GET_VAR, bufptr, buflen);
+
+       return (err);
+}
+
+static int
+wl_iovar_setbuf(struct net_device *dev, char *iovar, void *param, int paramlen, void *bufptr, int buflen)
+{
+       uint namelen;
+       uint iolen;
+
+       namelen = strlen(iovar) + 1;     /* length of iovar name plus null */
+       iolen = namelen + paramlen;
+
+       /* check for overflow */
+       if (iolen > buflen)
+               return (BCME_BUFTOOSHORT);
+
+       memcpy(bufptr, iovar, namelen); /* copy iovar name including null */
+       memcpy((int8*)bufptr + namelen, param, paramlen);
+
+       return wl_ioctl(dev, WLC_SET_VAR, bufptr, iolen);
+}
+
+static int
+wl_iovar_set(struct net_device *dev, char *iovar, void *param, int paramlen)
+{
+       char smbuf[WLC_IOCTL_SMLEN];
+
+       return wl_iovar_setbuf(dev, iovar, param, paramlen, smbuf, sizeof(smbuf));
 }
 
-static int wl_get_val(struct net_device *dev, char *var, void *val, int len)
+static int
+wl_iovar_get(struct net_device *dev, char *iovar, void *bufptr, int buflen)
 {
-       char buf[128];
-       int buf_len;
+       char smbuf[WLC_IOCTL_SMLEN];
        int ret;
 
+       /* use the return buffer if it is bigger than what we have on the stack */
+       if (buflen > sizeof(smbuf)) {
+               ret = wl_iovar_getbuf(dev, iovar, NULL, 0, bufptr, buflen);
+       } else {
+               ret = wl_iovar_getbuf(dev, iovar, NULL, 0, smbuf, sizeof(smbuf));
+               if (ret == 0)
+                       memcpy(bufptr, smbuf, buflen);
+       }
+
+       return ret;
+}
+
+#ifdef notyet
+/*
+ * format a bsscfg indexed iovar buffer
+ */
+static int
+wl_bssiovar_mkbuf(char *iovar, int bssidx, void *param, int paramlen, void *bufptr, int buflen,
+                  int *plen)
+{
+       char *prefix = "bsscfg:";
+       int8* p;
+       uint prefixlen;
+       uint namelen;
+       uint iolen;
+
+       prefixlen = strlen(prefix);     /* length of bsscfg prefix */
+       namelen = strlen(iovar) + 1;    /* length of iovar name + null */
+       iolen = prefixlen + namelen + sizeof(int) + paramlen;
+
        /* check for overflow */
-       if ((buf_len = strlen(var)) + 1 > sizeof(buf) || len > sizeof(buf))
-               return -1;
-       
-       strcpy(buf, var);
-       if (ret = wl_ioctl(dev, WLC_GET_VAR, buf, buf_len + len))
-               return ret;
+       if (buflen < 0 || iolen > (uint)buflen) {
+               *plen = 0;
+               return BCME_BUFTOOSHORT;
+       }
+
+       p = (int8*)bufptr;
+
+       /* copy prefix, no null */
+       memcpy(p, prefix, prefixlen);
+       p += prefixlen;
+
+       /* copy iovar name including null */
+       memcpy(p, iovar, namelen);
+       p += namelen;
+
+       /* bss config index as first param */
+       memcpy(p, &bssidx, sizeof(int32));
+       p += sizeof(int32);
+
+       /* parameter buffer follows */
+       if (paramlen)
+               memcpy(p, param, paramlen);
 
-       memcpy(val, buf, len);
+       *plen = iolen;
        return 0;
 }
 
+/*
+ * set named & bss indexed driver variable to buffer value
+ */
+static int
+wl_bssiovar_setbuf(struct net_device *dev, char *iovar, int bssidx, void *param, int paramlen, void *bufptr,
+                   int buflen)
+{
+       int err;
+       int iolen;
+
+       err = wl_bssiovar_mkbuf(iovar, bssidx, param, paramlen, bufptr, buflen, &iolen);
+       if (err)
+               return err;
+
+       return wl_ioctl(dev, WLC_SET_VAR, bufptr, iolen);
+}
+
+/*
+ * get named & bss indexed driver variable buffer value
+ */
+static int
+wl_bssiovar_getbuf(struct net_device *dev, char *iovar, int bssidx, void *param, int paramlen, void *bufptr,
+                   int buflen)
+{
+       int err;
+       int iolen;
+
+       err = wl_bssiovar_mkbuf(iovar, bssidx, param, paramlen, bufptr, buflen, &iolen);
+       if (err)
+               return err;
+
+       return wl_ioctl(dev, WLC_GET_VAR, bufptr, buflen);
+}
+
+/*
+ * set named & bss indexed driver variable to buffer value
+ */
+static int
+wl_bssiovar_set(struct net_device *dev, char *iovar, int bssidx, void *param, int paramlen)
+{
+       char smbuf[WLC_IOCTL_SMLEN];
+
+       return wl_bssiovar_setbuf(dev, iovar, bssidx, param, paramlen, smbuf, sizeof(smbuf));
+}
+
+/*
+ * get named & bss indexed driver variable buffer value
+ */
+static int
+wl_bssiovar_get(struct net_device *dev, char *iovar, int bssidx, void *outbuf, int len)
+{
+       char smbuf[WLC_IOCTL_SMLEN];
+       int err;
+
+       /* use the return buffer if it is bigger than what we have on the stack */
+       if (len > (int)sizeof(smbuf)) {
+               err = wl_bssiovar_getbuf(dev, iovar, bssidx, NULL, 0, outbuf, len);
+       } else {
+               memset(smbuf, 0, sizeof(smbuf));
+               err = wl_bssiovar_getbuf(dev, iovar, bssidx, NULL, 0, smbuf, sizeof(smbuf));
+               if (err == 0)
+                       memcpy(outbuf, smbuf, len);
+       }
+
+       return err;
+}
+#endif
+
 int get_primary_key(struct net_device *dev)
 {
        int key, val;
@@ -145,7 +289,7 @@ static int wlcompat_ioctl_getiwrange(struct net_device *dev,
        struct iw_range *range;
 
        range = (struct iw_range *) extra;
-       bzero(extra, sizeof(struct iw_range));
+       memset(extra, 0, sizeof(struct iw_range));
 
        range->we_version_compiled = WIRELESS_EXT;
        range->we_version_source = WIRELESS_EXT;
@@ -180,12 +324,12 @@ static int wlcompat_ioctl_getiwrange(struct net_device *dev,
        range->max_qual.noise = 0;
        
        range->min_rts = 0;
-       if (wl_ioctl(dev, WLC_GET_RTS, &range->max_rts, sizeof(int)) < 0)
+       if (wl_iovar_get(dev, "rtsthresh", &range->max_rts, sizeof(int)) < 0)
                range->max_rts = 2347;
 
        range->min_frag = 256;
        
-       if (wl_ioctl(dev, WLC_GET_FRAG, &range->max_frag, sizeof(int)) < 0)
+       if (wl_iovar_get(dev, "fragthresh", &range->max_frag, sizeof(int)) < 0)
                range->max_frag = 2346;
 
        range->txpower_capa = IW_TXPOW_DBM;
@@ -199,7 +343,7 @@ static int wlcompat_set_scan(struct net_device *dev,
                         union iwreq_data *wrqu,
                         char *extra)
 {
-       int ap = 0, oldap = 0;
+       int ap = 0;
        wl_scan_params_t params;
 
        memset(&params, 0, sizeof(params));
@@ -214,23 +358,39 @@ static int wlcompat_set_scan(struct net_device *dev,
        params.home_time = -1;
        
        /* can only scan in STA mode */
-       wl_ioctl(dev, WLC_GET_AP, &oldap, sizeof(oldap));
-       if (oldap > 0)
+       wl_ioctl(dev, WLC_GET_AP, &last_mode, sizeof(last_mode));
+       if (last_mode > 0) {
+               /* switch to ap mode, scan result query will switch back */
                wl_ioctl(dev, WLC_SET_AP, &ap, sizeof(ap));
-       
-       if (wl_ioctl(dev, WLC_SCAN, &params, 64) < 0)
+
+               /* wait 250 msec after mode change */
+               set_current_state(TASK_INTERRUPTIBLE);
+               schedule_timeout(msecs_to_jiffies(250));
+       }
+
+       scan_cur = SCAN_RETRY_MAX;
+       while (scan_cur-- && (wl_ioctl(dev, WLC_SCAN, &params, 64) < 0)) {
+               /* sometimes the driver takes a few tries... */
+               set_current_state(TASK_INTERRUPTIBLE);
+               schedule_timeout(msecs_to_jiffies(250));
+       }
+
+       if (!scan_cur) 
                return -EINVAL;
        
-       if (oldap > 0)
-               wl_ioctl(dev, WLC_SET_AP, &oldap, sizeof(oldap));
+       scan_cur = 0;
 
+       /* wait at least 2 seconds for results */
+       set_current_state(TASK_INTERRUPTIBLE);
+       schedule_timeout(msecs_to_jiffies(2000));
+       
        return 0;
 }
 
 
 struct iw_statistics *wlcompat_get_wireless_stats(struct net_device *dev)
 {
-       wl_bss_info_t *bss_info = (wl_bss_info_t *) buf;
+       struct wl_bss_info *bss_info = (struct wl_bss_info *) buf;
        get_pktcnt_t pkt;
        unsigned int rssi, noise, ap;
        
@@ -283,15 +443,18 @@ static int wlcompat_get_scan(struct net_device *dev,
        int i, j;
        int rssi, noise;
        
+       memset(buf, 0, WLC_IOCTL_MAXLEN);
        results->buflen = WLC_IOCTL_MAXLEN - sizeof(wl_scan_results_t);
        
        if (wl_ioctl(dev, WLC_SCAN_RESULTS, buf, WLC_IOCTL_MAXLEN) < 0)
                return -EAGAIN;
        
+       if ((results->count <= 0) && (scan_cur++ < SCAN_RETRY_MAX))
+               return -EAGAIN;
+       
        bss_info = &(results->bss_info[0]);
        info_ptr = (char *) bss_info;
        for (i = 0; i < results->count; i++) {
-
                /* send the cell address (must be sent first) */
                iwe.cmd = SIOCGIWAP;
                iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
@@ -319,7 +482,7 @@ static int wlcompat_get_scan(struct net_device *dev,
                /* send frequency/channel info */
                iwe.cmd = SIOCGIWFREQ;
                iwe.u.freq.e = 0;
-               iwe.u.freq.m = bss_info->channel;
+               iwe.u.freq.m = bss_info->chanspec;
                current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_FREQ_LEN);
 
                /* add quality statistics */
@@ -362,6 +525,10 @@ static int wlcompat_get_scan(struct net_device *dev,
        wrqu->data.length = (current_ev - extra);
        wrqu->data.flags = 0;
 
+       if (last_mode > 0)
+               /* switch back to ap mode */
+               wl_ioctl(dev, WLC_SET_AP, &last_mode, sizeof(last_mode));
+       
        return 0;
 }
 
@@ -430,20 +597,9 @@ static int wlcompat_ioctl(struct net_device *dev,
                        if (wl_ioctl(dev, WLC_GET_INFRA, &infra, sizeof(infra)) < 0)
                                return -EINVAL;
 
-                       if (!infra) {
+                       if (!infra) 
                                wl_ioctl(dev, WLC_SET_BSSID, wrqu->ap_addr.sa_data, 6);
 
-                               reg.size = 4;
-                               reg.byteoff = 0x184;
-                               reg.val = bss_force << 16 | bss_force;
-                               wl_ioctl(dev, WLC_W_REG, &reg, sizeof(reg));
-                               
-                               reg.byteoff = 0x180;
-                               wl_ioctl(dev, WLC_R_REG, &reg, sizeof(reg));
-                               reg.val = bss_force << 16;
-                               wl_ioctl(dev, WLC_W_REG, &reg, sizeof(reg));
-                       }
-
                        if (wl_ioctl(dev, ((ap || !infra) ? WLC_SET_BSSID : WLC_REASSOC), wrqu->ap_addr.sa_data, 6) < 0)
                                return -EINVAL;
 
@@ -451,20 +607,6 @@ static int wlcompat_ioctl(struct net_device *dev,
                }
                case SIOCGIWAP:
                {
-#ifdef DEBUG
-                       rw_reg_t reg;
-                       memset(&reg, 0, sizeof(reg));
-
-                       reg.size = 4;
-                       reg.byteoff = 0x184;
-                       wl_ioctl(dev, WLC_R_REG, &reg, sizeof(reg));
-                       printk("bss time = 0x%08x", reg.val);
-                       
-                       reg.byteoff = 0x180;
-                       wl_ioctl(dev, WLC_R_REG, &reg, sizeof(reg));
-                       printk("%08x\n", reg.val);
-#endif
-                       
                        wrqu->ap_addr.sa_family = ARPHRD_ETHER;
                        if (wl_ioctl(dev,WLC_GET_BSSID,wrqu->ap_addr.sa_data,6) < 0)
                                return -EINVAL;
@@ -487,8 +629,8 @@ static int wlcompat_ioctl(struct net_device *dev,
                        wlc_ssid_t ssid;
                        memset(&ssid, 0, sizeof(ssid));
                        ssid.SSID_len = strlen(extra);
-                       if (ssid.SSID_len > WLC_ESSID_MAX_SIZE)
-                               ssid.SSID_len = WLC_ESSID_MAX_SIZE;
+                       if (ssid.SSID_len > 32)
+                               ssid.SSID_len = 32;
                        memcpy(ssid.SSID, extra, ssid.SSID_len);
                        if (wl_ioctl(dev, WLC_SET_SSID, &ssid, sizeof(ssid)) < 0)
                                return -EINVAL;
@@ -496,25 +638,25 @@ static int wlcompat_ioctl(struct net_device *dev,
                }
                case SIOCGIWRTS:
                {
-                       if (wl_ioctl(dev,WLC_GET_RTS,&(wrqu->rts.value),sizeof(int)) < 0) 
+                       if (wl_iovar_get(dev, "rtsthresh", &(wrqu->rts.value), sizeof(int)) < 0) 
                                return -EINVAL;
                        break;
                }
                case SIOCSIWRTS:
                {
-                       if (wl_ioctl(dev,WLC_SET_RTS,&(wrqu->rts.value),sizeof(int)) < 0) 
+                       if (wl_iovar_set(dev, "rtsthresh", &(wrqu->rts.value), sizeof(int)) < 0) 
                                return -EINVAL;
                        break;
                }
                case SIOCGIWFRAG:
                {
-                       if (wl_ioctl(dev,WLC_GET_FRAG,&(wrqu->frag.value),sizeof(int)) < 0)
+                       if (wl_iovar_get(dev, "fragthresh", &(wrqu->frag.value), sizeof(int)) < 0)
                                return -EINVAL;
                        break;
                }
                case SIOCSIWFRAG:
                {
-                       if (wl_ioctl(dev,WLC_SET_FRAG,&(wrqu->frag.value),sizeof(int)) < 0)
+                       if (wl_iovar_set(dev, "fragthresh", &(wrqu->frag.value), sizeof(int)) < 0)
                                return -EINVAL;
                        break;
                }
@@ -524,7 +666,7 @@ static int wlcompat_ioctl(struct net_device *dev,
 
                        wl_ioctl(dev, WLC_GET_RADIO, &radio, sizeof(int));
                        
-                       if (wl_get_val(dev, "qtxpower", &(wrqu->txpower.value), sizeof(int)) < 0)
+                       if (wl_iovar_get(dev, "qtxpower", &(wrqu->txpower.value), sizeof(int)) < 0)
                                return -EINVAL;
                        
                        override = (wrqu->txpower.value & WL_TXPWR_OVERRIDE) == WL_TXPWR_OVERRIDE;
@@ -548,7 +690,7 @@ static int wlcompat_ioctl(struct net_device *dev,
                        if (!wrqu->txpower.disabled && (wrqu->txpower.value > 0)) {
                                int value;
                                
-                               if (wl_get_val(dev, "qtxpower", &value, sizeof(int)) < 0)
+                               if (wl_iovar_get(dev, "qtxpower", &value, sizeof(int)) < 0)
                                        return -EINVAL;
                                
                                value &= WL_TXPWR_OVERRIDE;
@@ -559,7 +701,7 @@ static int wlcompat_ioctl(struct net_device *dev,
                                        return -EINVAL;
                                
                                if (wrqu->txpower.value > 0)
-                                       if (wl_set_val(dev, "qtxpower", &(wrqu->txpower.value), sizeof(int)) < 0)
+                                       if (wl_iovar_set(dev, "qtxpower", &(wrqu->txpower.value), sizeof(int)) < 0)
                                                return -EINVAL;
                        }
                        break;
@@ -609,34 +751,23 @@ static int wlcompat_ioctl(struct net_device *dev,
                case SIOCGIWENCODE:
                {
                        int val;
+                       int key = get_primary_key(dev);
+                       int *info_addr; 
+                       wkey *wep_key;
                        
-                       if (wl_ioctl(dev, WLC_GET_WEP, &val, sizeof(val)) < 0)
+                       if (wl_ioctl(dev, WLC_GET_WSEC, &val, sizeof(val)) < 0)
                                return -EINVAL;
-                       
-
-                       if (val > 0) {
-                               int key = get_primary_key(dev);
-                               
-                               wrqu->data.flags = IW_ENCODE_ENABLED;
-                               if (key-- > 0) {
-                                       int *info_addr; 
-                                       wkey *wep_key;
-                                       
-                                       info_addr = (int *) dev->priv;
-                                       wep_key = (wkey *) ((*info_addr) + 0x2752 + (key * 0x110));
-                                       
-                                       wrqu->data.flags |= key + 1;
-                                       wrqu->data.length = wep_key->len;
-
-                                       memset(extra, 0, 16);
-                                       memcpy(extra, wep_key->data, 16);
-                               } else {
-                                       wrqu->data.flags |= IW_ENCODE_NOKEY;
-                               }
-                       } else {
+                       if (!(val & WEP_ENABLED)) {
                                wrqu->data.flags = IW_ENCODE_DISABLED;
+                               break;
                        }
-                       
+
+                       key = get_primary_key(dev);
+                       wrqu->data.flags = IW_ENCODE_ENABLED;
+
+                       /* the driver apparently doesn't allow us to read the wep key */
+                       wrqu->data.flags |= IW_ENCODE_NOKEY;
+
                        break;
                }
                case SIOCGIWRANGE:
@@ -716,12 +847,8 @@ static int wlcompat_ioctl(struct net_device *dev,
                        break;
                }
                default:
-               {
-                       if (info->cmd >= SIOCIWFIRSTPRIV)
-                               return wlcompat_private_ioctl(dev, info, wrqu, extra);
-
                        return -EINVAL;
-               }
+                       break;
        }
        
        return 0;
@@ -775,183 +902,10 @@ static const iw_handler   wlcompat_handler[] = {
 };
 
 
-#define WLCOMPAT_SET_MONITOR           SIOCIWFIRSTPRIV + 0
-#define WLCOMPAT_GET_MONITOR           SIOCIWFIRSTPRIV + 1
-#define WLCOMPAT_SET_TXPWR_LIMIT       SIOCIWFIRSTPRIV + 2
-#define WLCOMPAT_GET_TXPWR_LIMIT       SIOCIWFIRSTPRIV + 3
-#define WLCOMPAT_SET_ANTDIV                    SIOCIWFIRSTPRIV + 4
-#define WLCOMPAT_GET_ANTDIV                    SIOCIWFIRSTPRIV + 5
-#define WLCOMPAT_SET_TXANT                     SIOCIWFIRSTPRIV + 6
-#define WLCOMPAT_GET_TXANT                     SIOCIWFIRSTPRIV + 7
-#define WLCOMPAT_SET_BSS_FORCE         SIOCIWFIRSTPRIV + 8
-#define WLCOMPAT_GET_BSS_FORCE         SIOCIWFIRSTPRIV + 9
-
-
-static int wlcompat_private_ioctl(struct net_device *dev,
-                        struct iw_request_info *info,
-                        union iwreq_data *wrqu,
-                        char *extra)
-{
-       int *value = (int *) wrqu->name;
-
-       switch (info->cmd) {
-               case WLCOMPAT_SET_MONITOR:
-               {
-                       if (wl_ioctl(dev, WLC_SET_MONITOR, value, sizeof(int)) < 0)
-                               return -EINVAL;
-
-                       break;
-               }
-               case WLCOMPAT_GET_MONITOR:
-               {
-                       if (wl_ioctl(dev, WLC_GET_MONITOR, extra, sizeof(int)) < 0)
-                               return -EINVAL;
-
-                       break;
-               }
-               case WLCOMPAT_SET_TXPWR_LIMIT:
-               {
-                       int val;
-                       
-
-                       if (wl_get_val(dev, "qtxpower", &val, sizeof(int)) < 0)
-                               return -EINVAL;
-                       
-                       if (*extra > 0)
-                               val |= WL_TXPWR_OVERRIDE;
-                       else
-                               val &= ~WL_TXPWR_OVERRIDE;
-                       
-                       if (wl_set_val(dev, "qtxpower", &val, sizeof(int)) < 0)
-                               return -EINVAL;
-                       
-                       break;
-               }
-               case WLCOMPAT_GET_TXPWR_LIMIT:
-               {
-                       if (wl_get_val(dev, "qtxpower", value, sizeof(int)) < 0)
-                               return -EINVAL;
-
-                       *value = ((*value & WL_TXPWR_OVERRIDE) == WL_TXPWR_OVERRIDE ? 1 : 0);
-
-                       break;
-               }
-               case WLCOMPAT_SET_ANTDIV:
-               {
-                       if (wl_ioctl(dev, WLC_SET_ANTDIV, value, sizeof(int)) < 0)
-                               return -EINVAL;
-
-                       break;
-               }
-               case WLCOMPAT_GET_ANTDIV:
-               {
-                       if (wl_ioctl(dev, WLC_GET_ANTDIV, extra, sizeof(int)) < 0)
-                               return -EINVAL;
-
-                       break;
-               }
-               case WLCOMPAT_SET_TXANT:
-               {
-                       if (wl_ioctl(dev, WLC_SET_TXANT, value, sizeof(int)) < 0)
-                               return -EINVAL;
-
-                       break;
-               }
-               case WLCOMPAT_GET_TXANT:
-               {
-                       if (wl_ioctl(dev, WLC_GET_TXANT, extra, sizeof(int)) < 0)
-                               return -EINVAL;
-
-                       break;
-               }
-               case WLCOMPAT_SET_BSS_FORCE:
-               {
-                       bss_force = (unsigned short) *value;
-                       break;
-               }
-               case WLCOMPAT_GET_BSS_FORCE:
-               {
-                       *extra = (int) bss_force;
-                       break;
-               }
-               default:
-               {
-                       return -EINVAL;
-               }
-                       
-       }
-       return 0;
-}
-
-static const struct iw_priv_args wlcompat_private_args[] = 
-{
-       {       WLCOMPAT_SET_MONITOR, 
-               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-               0,
-               "set_monitor"
-       },
-       {       WLCOMPAT_GET_MONITOR, 
-               0,
-               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-               "get_monitor"
-       },
-       {       WLCOMPAT_SET_TXPWR_LIMIT, 
-               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-               0,
-               "set_txpwr_force"
-       },
-       {       WLCOMPAT_GET_TXPWR_LIMIT, 
-               0,
-               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-               "get_txpwr_force"
-       },
-       {       WLCOMPAT_SET_ANTDIV, 
-               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-               0,
-               "set_antdiv"
-       },
-       {       WLCOMPAT_GET_ANTDIV, 
-               0,
-               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-               "get_antdiv"
-       },
-       {       WLCOMPAT_SET_TXANT, 
-               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-               0,
-               "set_txant"
-       },
-       {       WLCOMPAT_GET_TXANT, 
-               0,
-               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-               "get_txant"
-       },
-       {       WLCOMPAT_SET_BSS_FORCE, 
-               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-               0,
-               "set_bss_force"
-       },
-       {       WLCOMPAT_GET_BSS_FORCE, 
-               0,
-               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-               "get_bss_force"
-       },
-};
-
-static const iw_handler wlcompat_private[] =
-{
-       wlcompat_private_ioctl,
-       NULL
-};
-
-
 static const struct iw_handler_def wlcompat_handler_def =
 {
        .standard       = (iw_handler *) wlcompat_handler,
        .num_standard   = sizeof(wlcompat_handler)/sizeof(iw_handler),
-       .private        = wlcompat_private,
-       .num_private    = 1,
-       .private_args   = wlcompat_private_args,
-       .num_private_args = sizeof(wlcompat_private_args) / sizeof(wlcompat_private_args[0])
 };
 
 
@@ -979,14 +933,7 @@ static int new_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) {
        
 #ifdef DEBUG
        printk("dev: %s ioctl: 0x%04x\n",dev->name,cmd);
-#endif
-
-       if (cmd >= SIOCIWFIRSTPRIV) {
-               info.cmd = cmd;
-               info.flags = 0;
-               ret = wlcompat_private_ioctl(dev, &info, &(iwr->u), (char *) &(iwr->u));
-#ifdef DEBUG
-       } else if (cmd==SIOCDEVPRIVATE) {
+       if (cmd==SIOCDEVPRIVATE) {
                wl_ioctl_t *ioc = (wl_ioctl_t *)ifr->ifr_data;
                unsigned char *buf = ioc->buf;
                printk("   cmd: %d buf: 0x%08x len: %d\n",ioc->cmd,&(ioc->buf),ioc->len);
@@ -996,8 +943,9 @@ static int new_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) {
                printk("   recv: ->");
                print_buffer(ioc->len, buf);
                printk("   ret: %d\n", ret);
+       } else
 #endif
-       } else {
+       {
                ret = old_ioctl(dev,ifr,cmd);
        }
        return ret;
@@ -1005,17 +953,22 @@ static int new_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) {
 
 #ifndef DEBUG
 static struct timer_list rng_timer;
+static spinlock_t rng_lock = SPIN_LOCK_UNLOCKED;
 
 static void rng_timer_tick(unsigned long n)
 {
        struct net_device *dev = (struct net_device *) n;
+       unsigned long flags;
        u16 data[4];
        int i, ret;
        
        ret = 0;
+       spin_lock_irqsave(&rng_lock, flags);
        for (i = 0; i < 3; i++) {
-               ret |= wl_get_val(dev, "rand", &data[i], sizeof(u16));
+               ret |= wl_iovar_get(dev, "rand", &data[i], sizeof(u16));
        }
+       spin_unlock_irqrestore(&rng_lock, flags);
+
        if (!ret)
                batch_entropy_store(*((u32 *) &data[0]), *((u32 *) &data[2]), (jiffies % 255));
 
@@ -1027,7 +980,6 @@ static int __init wlcompat_init()
 {
        int found = 0, i;
        char devname[4] = "wl0";
-       bss_force = 0;
        
        while (!found && (dev = dev_get_by_name(devname))) {
                if ((dev->wireless_handlers == NULL) && ((wl_ioctl(dev, WLC_GET_MAGIC, &i, sizeof(i)) == 0) && i == WLC_IOCTL_MAGIC))