dhdutil: Update to support driver 1.88.X
Dmitry Shmidt [Fri, 22 Mar 2013 21:42:20 +0000 (14:42 -0700)]
Change-Id: I1534b89fb483fd7d28c8ed1219bcbe1d1e7c4f45
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>

48 files changed:
bcmdhd/dhdutil/Android.mk
bcmdhd/dhdutil/bcmutils.c
bcmdhd/dhdutil/dhdu.c
bcmdhd/dhdutil/dhdu.h
bcmdhd/dhdutil/dhdu_cmd.h
bcmdhd/dhdutil/dhdu_common.h
bcmdhd/dhdutil/dhdu_linux.c
bcmdhd/dhdutil/dhdu_nl80211.c [new file with mode: 0644]
bcmdhd/dhdutil/dhdu_nl80211.h [new file with mode: 0644]
bcmdhd/dhdutil/include/bcm_cfg.h
bcmdhd/dhdutil/include/bcm_mpool_pub.h
bcmdhd/dhdutil/include/bcmcdc.h
bcmdhd/dhdutil/include/bcmdefs.h
bcmdhd/dhdutil/include/bcmdevs.h
bcmdhd/dhdutil/include/bcmendian.h
bcmdhd/dhdutil/include/bcmutils.h
bcmdhd/dhdutil/include/bcmwifi.h [deleted file]
bcmdhd/dhdutil/include/bcmwifi_channels.h
bcmdhd/dhdutil/include/bcmwifi_rates.h
bcmdhd/dhdutil/include/dhdioctl.h
bcmdhd/dhdutil/include/epivers.h
bcmdhd/dhdutil/include/hndrte_armtrap.h [new file with mode: 0644]
bcmdhd/dhdutil/include/hndrte_cons.h [new file with mode: 0644]
bcmdhd/dhdutil/include/hndrte_debug.h [new file with mode: 0644]
bcmdhd/dhdutil/include/miniopt.h
bcmdhd/dhdutil/include/packed_section_end.h
bcmdhd/dhdutil/include/packed_section_start.h
bcmdhd/dhdutil/include/proto/802.11.h
bcmdhd/dhdutil/include/proto/802.11_bta.h [new file with mode: 0644]
bcmdhd/dhdutil/include/proto/802.11e.h [new file with mode: 0644]
bcmdhd/dhdutil/include/proto/802.1d.h
bcmdhd/dhdutil/include/proto/802.3.h [new file with mode: 0644]
bcmdhd/dhdutil/include/proto/bcmeth.h
bcmdhd/dhdutil/include/proto/bcmevent.h
bcmdhd/dhdutil/include/proto/bcmip.h
bcmdhd/dhdutil/include/proto/bt_amp_hci.h
bcmdhd/dhdutil/include/proto/eapol.h [new file with mode: 0644]
bcmdhd/dhdutil/include/proto/ethernet.h
bcmdhd/dhdutil/include/proto/p2p.h [new file with mode: 0644]
bcmdhd/dhdutil/include/proto/vlan.h
bcmdhd/dhdutil/include/proto/wpa.h
bcmdhd/dhdutil/include/sdiovar.h
bcmdhd/dhdutil/include/trxhdr.h
bcmdhd/dhdutil/include/typedefs.h
bcmdhd/dhdutil/include/wlioctl.h
bcmdhd/dhdutil/miniopt.c
bcmdhd/dhdutil/ucode_download.c [new file with mode: 0644]
bcmdhd/dhdutil/ucode_download.h [new file with mode: 0644]

index bc4c27b..16cbc78 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Copyright (C) 2008-2011 Broadcom Corporation
 #
-# $Id: Android.mk,v 2.6 2009-05-07 18:25:15 hharte Exp $
+# $Id: Android.mk,v 2.6 2009-05-07 18:25:15 $
 #
 # Permission to use, copy, modify, and/or distribute this software for any
 # purpose with or without fee is hereby granted, provided that the above
index 7ecea8e..0fdbe73 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Driver O/S-independent utility routines
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  * 
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -15,7 +15,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: bcmutils.c 312855 2012-02-04 02:01:18Z $
+ * $Id: bcmutils.c 380908 2013-01-24 12:26:18Z $
  */
 
 #include <bcm_cfg.h>
@@ -187,7 +187,7 @@ pktsegcnt_war(osl_t *osh, void *p)
 }
 
 uint8 * BCMFASTPATH
-pktoffset(osl_t *osh, void *p,  uint offset)
+pktdataoffset(osl_t *osh, void *p,  uint offset)
 {
        uint total = pkttotlen(osh, p);
        uint pkt_off = 0, len = 0;
@@ -206,6 +206,25 @@ pktoffset(osl_t *osh, void *p,  uint offset)
        return (uint8*) (pdata+pkt_off);
 }
 
+
+/* given a offset in pdata, find the pkt seg hdr */
+void *
+pktoffset(osl_t *osh, void *p,  uint offset)
+{
+       uint total = pkttotlen(osh, p);
+       uint len = 0;
+
+       if (offset > total)
+               return NULL;
+
+       for (; p; p = PKTNEXT(osh, p)) {
+               len += PKTLEN(osh, p);
+               if (len > offset)
+                       break;
+       }
+       return p;
+}
+
 /*
  * osl multiple-precedence packet queue
  * hi_prec is always >= the number of the highest non-empty precedence
@@ -319,6 +338,44 @@ pktq_pdeq_prev(struct pktq *pq, int prec, void *prev_p)
 }
 
 void * BCMFASTPATH
+pktq_pdeq_with_fn(struct pktq *pq, int prec, ifpkt_cb_t fn, int arg)
+{
+       struct pktq_prec *q;
+       void *p, *prev = NULL;
+
+       ASSERT(prec >= 0 && prec < pq->num_prec);
+
+       q = &pq->q[prec];
+       p = q->head;
+
+       while (p) {
+               if (fn == NULL || (*fn)(p, arg)) {
+                       break;
+               } else {
+                       prev = p;
+                       p = PKTLINK(p);
+               }
+       }
+       if (p == NULL)
+               return NULL;
+
+       if (prev == NULL) {
+               if ((q->head = PKTLINK(p)) == NULL)
+                       q->tail = NULL;
+       } else {
+               PKTSETLINK(prev, PKTLINK(p));
+       }
+
+       q->len--;
+
+       pq->len--;
+
+       PKTSETLINK(p, NULL);
+
+       return p;
+}
+
+void * BCMFASTPATH
 pktq_pdeq_tail(struct pktq *pq, int prec)
 {
        struct pktq_prec *q;
@@ -649,6 +706,7 @@ pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out)
 
 #endif /* BCMDRIVER */
 
+#if !defined(BCMROMOFFLOAD_EXCLUDE_BCMUTILS_FUNCS)
 const unsigned char bcm_ctype[] = {
 
        _BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,                        /* 0-7 */
@@ -962,6 +1020,7 @@ bcm_ether_atoe(const char *p, struct ether_addr *ea)
 
        return (i == 6);
 }
+#endif /* !BCMROMOFFLOAD_EXCLUDE_BCMUTILS_FUNCS */
 
 
 #if defined(CONFIG_USBRNDIS_RETAIL) || defined(NDIS_MINIPORT_DRIVER)
@@ -1073,7 +1132,7 @@ pktsetprio(void *pkt, bool update_vtag)
 
        eh = (struct ether_header *) pktdata;
 
-       if (ntoh16(eh->ether_type) == ETHER_TYPE_8021Q) {
+       if (eh->ether_type == hton16(ETHER_TYPE_8021Q)) {
                uint16 vlan_tag;
                int vlan_prio, dscp_prio = 0;
 
@@ -1082,7 +1141,7 @@ pktsetprio(void *pkt, bool update_vtag)
                vlan_tag = ntoh16(evh->vlan_tag);
                vlan_prio = (int) (vlan_tag >> VLAN_PRI_SHIFT) & VLAN_PRI_MASK;
 
-               if (ntoh16(evh->ether_type) == ETHER_TYPE_IP) {
+               if (evh->ether_type == hton16(ETHER_TYPE_IP)) {
                        uint8 *ip_body = pktdata + sizeof(struct ethervlan_header);
                        uint8 tos_tc = IP_TOS46(ip_body);
                        dscp_prio = (int)(tos_tc >> IPV4_TOS_PREC_SHIFT);
@@ -1109,7 +1168,7 @@ pktsetprio(void *pkt, bool update_vtag)
                        evh->vlan_tag = hton16(vlan_tag);
                        rc |= PKTPRIO_UPD;
                }
-       } else if (ntoh16(eh->ether_type) == ETHER_TYPE_IP) {
+       } else if (eh->ether_type == hton16(ETHER_TYPE_IP)) {
                uint8 *ip_body = pktdata + sizeof(struct ether_header);
                uint8 tos_tc = IP_TOS46(ip_body);
                priority = (int)(tos_tc >> IPV4_TOS_PREC_SHIFT);
@@ -1218,6 +1277,7 @@ bcm_iovar_lencheck(const bcm_iovar_t *vi, void *arg, int len, bool set)
 #endif /* BCMDRIVER */
 
 
+#if !defined(BCMROMOFFLOAD_EXCLUDE_BCMUTILS_FUNCS)
 /*******************************************************************************
  * crc8
  *
@@ -1574,10 +1634,36 @@ bcm_parse_ordered_tlvs(void *buf, int buflen, uint key)
        }
        return NULL;
 }
+#endif /* !BCMROMOFFLOAD_EXCLUDE_BCMUTILS_FUNCS */
 
 #if defined(WLMSG_PRHDRS) || defined(WLMSG_PRPKT) || defined(WLMSG_ASSOC) || \
        defined(DHD_DEBUG)
 int
+bcm_format_field(const bcm_bit_desc_ex_t *bd, uint32 flags, char* buf, int len)
+{
+       int i, slen = 0;
+       uint32 bit, mask;
+       const char *name;
+       mask = bd->mask;
+       if (len < 2 || !buf)
+               return 0;
+
+       buf[0] = '\0';
+
+       for (i = 0;  (name = bd->bitfield[i].name) != NULL; i++) {
+               bit = bd->bitfield[i].bit;
+               if ((flags & mask) == bit) {
+                       if (len > (int)strlen(name)) {
+                               slen = strlen(name);
+                               strncpy(buf, name, slen+1);
+                       }
+                       break;
+               }
+       }
+       return slen;
+}
+
+int
 bcm_format_flags(const bcm_bit_desc_t *bd, uint32 flags, char* buf, int len)
 {
        int i;
@@ -1694,9 +1780,6 @@ static const char *crypto_algo_names[] = {
        "UNDEF",
        "UNDEF",
        "UNDEF",
-#ifdef BCMWAPI_WPI
-       "WAPI",
-#endif /* BCMWAPI_WPI */
        "UNDEF"
 };
 
@@ -1999,6 +2082,39 @@ bcm_print_bytes(const char *name, const uchar *data, int len)
        }
        printf("\n");
 }
+
+/* Look for vendor-specific IE with specified OUI and optional type */
+bcm_tlv_t *
+find_vendor_ie(void *tlvs, int tlvs_len, const char *voui, uint8 *type, int type_len)
+{
+       bcm_tlv_t *ie;
+       uint8 ie_len;
+
+       ie = (bcm_tlv_t*)tlvs;
+
+       /* make sure we are looking at a valid IE */
+       if (ie == NULL ||
+           !bcm_valid_tlv(ie, tlvs_len))
+               return NULL;
+
+       /* Walk through the IEs looking for an OUI match */
+       do {
+               ie_len = ie->len;
+               if ((ie->id == DOT11_MNG_PROPR_ID) &&
+                   (ie_len >= (DOT11_OUI_LEN + type_len)) &&
+                   !bcmp(ie->data, voui, DOT11_OUI_LEN))
+               {
+                       /* compare optional type */
+                       if (type_len == 0 ||
+                           !bcmp(&ie->data[DOT11_OUI_LEN], type, type_len)) {
+                               return (ie);            /* a match */
+                       }
+               }
+       } while ((ie = bcm_next_tlv(ie, &tlvs_len)) != NULL);
+
+       return NULL;
+}
+
 #if defined(WLTINYDUMP) || defined(WLMSG_INFORM) || defined(WLMSG_ASSOC) || \
        defined(WLMSG_PRPKT) || defined(WLMSG_WSEC)
 #define SSID_FMT_BUF_LEN       ((4 * DOT11_MAX_SSID_LEN) + 1)
@@ -2086,3 +2202,93 @@ process_nvram_vars(char *varbuf, unsigned int len)
 
        return buf_len;
 }
+
+/* calculate a * b + c */
+void
+bcm_uint64_multiple_add(uint32* r_high, uint32* r_low, uint32 a, uint32 b, uint32 c)
+{
+#define FORMALIZE(var) {cc += (var & 0x80000000) ? 1 : 0; var &= 0x7fffffff;}
+       uint32 r1, r0;
+       uint32 a1, a0, b1, b0, t, cc = 0;
+
+       a1 = a >> 16;
+       a0 = a & 0xffff;
+       b1 = b >> 16;
+       b0 = b & 0xffff;
+
+       r0 = a0 * b0;
+       FORMALIZE(r0);
+
+       t = (a1 * b0) << 16;
+       FORMALIZE(t);
+
+       r0 += t;
+       FORMALIZE(r0);
+
+       t = (a0 * b1) << 16;
+       FORMALIZE(t);
+
+       r0 += t;
+       FORMALIZE(r0);
+
+       FORMALIZE(c);
+
+       r0 += c;
+       FORMALIZE(r0);
+
+       r0 |= (cc % 2) ? 0x80000000 : 0;
+       r1 = a1 * b1 + ((a1 * b0) >> 16) + ((b1 * a0) >> 16) + (cc / 2);
+
+       *r_high = r1;
+       *r_low = r0;
+}
+
+/* calculate a / b */
+void
+bcm_uint64_divide(uint32* r, uint32 a_high, uint32 a_low, uint32 b)
+{
+       uint32 a1 = a_high, a0 = a_low, r0 = 0;
+
+       if (b < 2)
+               return;
+
+       while (a1 != 0) {
+               r0 += (0xffffffff / b) * a1;
+               bcm_uint64_multiple_add(&a1, &a0, ((0xffffffff % b) + 1) % b, a1, a0);
+       }
+
+       r0 += a0 / b;
+       *r = r0;
+}
+
+#ifndef setbit     /* As in the header file */
+#ifdef BCMUTILS_BIT_MACROS_USE_FUNCS
+/* Set bit in byte array. */
+void
+setbit(void *array, uint bit)
+{
+       ((uint8 *)array)[bit / NBBY] |= 1 << (bit % NBBY);
+}
+
+/* Clear bit in byte array. */
+void
+clrbit(void *array, uint bit)
+{
+       ((uint8 *)array)[bit / NBBY] &= ~(1 << (bit % NBBY));
+}
+
+/* Test if bit is set in byte array. */
+bool
+isset(const void *array, uint bit)
+{
+       return (((const uint8 *)array)[bit / NBBY] & (1 << (bit % NBBY)));
+}
+
+/* Test if bit is clear in byte array. */
+bool
+isclr(const void *array, uint bit)
+{
+       return ((((const uint8 *)array)[bit / NBBY] & (1 << (bit % NBBY))) == 0);
+}
+#endif /* BCMUTILS_BIT_MACROS_USE_FUNCS */
+#endif /* setbit */
index 5de111a..6b2007c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Common code for DHD command-line utility
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -15,7 +15,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: dhdu.c 355225 2012-09-05 22:35:10Z $
+ * $Id: dhdu.c 385965 2013-02-19 04:33:34Z $
  */
 
 /* For backwards compatibility, the absence of the define 'BWL_NO_FILESYSTEM_SUPPORT'
 #include <bcmendian.h>
 #include "dhdu.h"
 #include "miniopt.h"
-/* #include <usbrdl.h> */
 #include <proto/bcmip.h>
+#include <hndrte_debug.h>
+#include <hndrte_armtrap.h>
+#include <hndrte_cons.h>
 #define IPV4_ADDR_LEN 4
-#ifdef WLBTAMP
-#include <proto/bt_amp_hci.h>
-#endif
 
 #include <errno.h>
 
 #include <trxhdr.h>
-/* #include "ucode_download.h"  Greg */
+#include "ucode_download.h"
 
 #define stricmp strcasecmp
 #define strnicmp strncasecmp
 
-#ifndef RDL_CHUNK
-#define RDL_CHUNK      1500
-#endif
 
 static cmd_func_t dhd_var_void;
 static cmd_func_t dhd_varint, dhd_varstr;
@@ -78,7 +74,7 @@ static cmd_func_t dhd_sdreg;
 static cmd_func_t dhd_sd_msglevel, dhd_sd_blocksize, dhd_sd_mode, dhd_sd_reg;
 static cmd_func_t dhd_dma_mode;
 static cmd_func_t dhd_membytes, dhd_download, dhd_dldn,
-       dhd_upload, dhd_vars, dhd_idleclock, dhd_idletime;
+       dhd_upload, dhd_coredump, dhd_consoledump, dhd_vars, dhd_idleclock, dhd_idletime;
 static cmd_func_t dhd_logstamp;
 
 static cmd_func_t dhd_hostreorder_flows;
@@ -86,6 +82,7 @@ static cmd_func_t dhd_hostreorder_flows;
 #ifdef PROP_TXSTATUS
 static cmd_func_t dhd_proptxstatusenable;
 static cmd_func_t dhd_proptxstatusmode;
+static cmd_func_t dhd_proptxopt;
 #endif
 static int dhd_var_getbuf(void *dhd, char *iovar, void *param, int param_len, void **bufptr);
 static int dhd_var_setbuf(void *dhd, char *iovar, void *param, int param_len);
@@ -100,10 +97,6 @@ static int file_size(char *fname);
 static int read_vars(char *fname, char *buf, int buf_maxlen);
 #endif
 
-#ifdef WLBTAMP
-static cmd_func_t wl_HCI_cmd;
-static cmd_func_t wl_HCI_ACL_data;
-#endif
 
 /* dword align allocation */
 static union {
@@ -115,6 +108,9 @@ static char *buf = (char*) &bufstruct_dhd.bufdata;
 /* integer output format, default to signed integer */
 static uint8 int_fmt;
 
+#define DEBUG_INFO_PTRS_END 0xffffffff
+const uint32 debug_info_ptrs[] = {0xf8, 0x878, DEBUG_INFO_PTRS_END};
+
 typedef struct {
        uint value;
        char *string;
@@ -177,7 +173,9 @@ cmd_t dhd_cmds[] = {
        "logcal <n>  -- log around an osl_delay of <n> usecs"},
        { "logstamp", dhd_logstamp, -1, DHD_SET_VAR,
        "logstamp [<n1>] [<n2>]  -- add a message to the log"},
-       { "memsize", dhd_varint, DHD_GET_VAR, -1,
+       { "ramstart", dhd_varint, DHD_GET_VAR, -1,
+       "display start address of onchip SOCRAM"},
+       { "ramsize", dhd_varint, DHD_GET_VAR, -1,
        "display size of onchip SOCRAM"},
        { "membytes", dhd_membytes, DHD_GET_VAR, DHD_SET_VAR,
        "membytes [-h | -r | -i] <address> <length> [<data>]\n"
@@ -198,6 +196,13 @@ cmd_t dhd_cmds[] = {
        { "vars", dhd_vars, DHD_GET_VAR, DHD_SET_VAR,
        "vars [<file>]\n"
        "\toverride SPROM vars with <file> (before download)\n"},
+       { "coredump", dhd_coredump, -1, -1,
+       "coredump <file>\n"
+       "\tdump dongle RAM content into a file in dumpfile format\n"
+       "\tfor use with ELF core generator"},
+       { "consoledump", dhd_consoledump, -1, -1,
+       "consoledump\n"
+       "\tdump dongle debug console buffer"},
        { "upload", dhd_upload, -1, -1,
        "upload [-a <address> ] <file> [<size>]\n"
        "\tupload dongle RAM content into a file\n"
@@ -273,6 +278,8 @@ cmd_t dhd_cmds[] = {
        "set the divisor for SDIO clock generation"},
        { "sd_power", dhd_varint, DHD_GET_VAR, DHD_SET_VAR,
        "set the SD Card slot power"},
+       { "sd_power_save", dhd_varint, DHD_GET_VAR, DHD_SET_VAR,
+       "set the SDIO3.0 power save value"},
        { "sd_clock", dhd_varint, DHD_GET_VAR, DHD_SET_VAR,
        "turn on/off the SD Clock"},
        { "sd_crc", dhd_varint, DHD_GET_VAR, DHD_SET_VAR,
@@ -291,14 +298,6 @@ cmd_t dhd_cmds[] = {
        "Move device into or out of reset state (1/reset, or 0/operational)"},
        { "ioctl_timeout", dhd_varint, DHD_GET_VAR, DHD_SET_VAR,
        "IOCTL response timeout (milliseconds)."},
-#ifdef WLBTAMP
-       { "HCI_cmd", wl_HCI_cmd, -1, DHD_SET_VAR,
-       "carries HCI commands to the driver\n"
-       "\tusage: dhd HCI_cmd <command> <args>\n" },
-       { "HCI_ACL_data", wl_HCI_ACL_data, -1, DHD_SET_VAR,
-       "carries HCI ACL data packet to the driver\n"
-       "\tusage: dhd HCI_ACL_data <logical link handle> <data>\n" },
-#endif
 #ifdef PROP_TXSTATUS
        { "proptx", dhd_proptxstatusenable, DHD_GET_VAR, DHD_SET_VAR,
        "enable/disable the proptxtstatus feature\n"
@@ -309,6 +308,10 @@ cmd_t dhd_cmds[] = {
        "0 - Unsupported\n"
        "1 - Use implied credit from a packet status\n"
        "2 - Use explicit credit\n" },
+       { "proptx_opt", dhd_proptxopt, DHD_GET_VAR, DHD_SET_VAR,
+       "enable/disable proptxtstatus optimizations to increase throughput:\n"
+       "0 - Unsupported\n"
+       "1 - Enable proptxstatus optimizations to increase throughput\n" },
 #endif
        { "sd_uhsimode", dhd_varint, DHD_GET_VAR, DHD_SET_VAR,
        "g/set UHSI Mode"},
@@ -318,6 +321,10 @@ cmd_t dhd_cmds[] = {
        "max glom size for sdio tx\n"},
        { "txglommode", dhd_varint, DHD_GET_VAR, DHD_SET_VAR,
        "glom mode for sdio tx 0- copy, 1- multidescriptor\n"},
+       { "fw_hang_report", dhd_varint, DHD_GET_VAR, DHD_SET_VAR,
+       "enable/disable report firmware hangs for firmware reload\n"
+       "0 - disabled (for testing)\n"
+       "1 - enabled (default)\n"},
        { NULL, NULL, 0, 0, NULL }
 };
 
@@ -437,7 +444,7 @@ dhd_list(void *dhd, cmd_t *garb, char **argv)
        buf = malloc(len);
        if (buf == NULL) {
                fprintf(stderr, "Failed to allocate buffer of %d bytes\n", len);
-               return COMMAND_ERROR;
+               return BCME_NOMEM;
        }
        for (i = 0; i < len; i++)
                *(buf+i) = 0;
@@ -513,11 +520,11 @@ dhd_check(void *dhd)
        int ret;
        int val;
 
-       if ((ret = dhd_get(dhd, DHD_GET_MAGIC, &val, sizeof(int)) < 0))
+       if ((ret = dhd_get(dhd, DHD_GET_MAGIC, &val, sizeof(int))) < 0)
                return ret;
        if (val != DHD_IOCTL_MAGIC)
                return -1;
-       if ((ret = dhd_get(dhd, DHD_GET_VERSION, &val, sizeof(int)) < 0))
+       if ((ret = dhd_get(dhd, DHD_GET_VERSION, &val, sizeof(int))) < 0)
                return ret;
        if (val > DHD_IOCTL_VERSION) {
                fprintf(stderr, "Version mismatch, please upgrade\n");
@@ -599,7 +606,7 @@ dhd_pktgen(void *dhd, cmd_t *cmd, char **argv)
        if (pktgen.version != DHD_PKTGEN_VERSION) {
                fprintf(stderr, "pktgen version mismatch (module %d app %d)\n",
                        pktgen.version, DHD_PKTGEN_VERSION);
-               return COMMAND_ERROR;
+               return BCME_ERROR;
        }
 
        /* Presence of args implies a set, else a get */
@@ -661,14 +668,14 @@ dhd_pktgen(void *dhd, cmd_t *cmd, char **argv)
                                else {
                                        fprintf(stderr, "unrecognized dir mode %s\n",
                                                opts.valstr);
-                                       return USAGE_ERROR;
+                                       return BCME_USAGE_ERROR;
                                }
                                break;
 
                        default:
                                fprintf(stderr, "option parsing error (key %s valstr %s)\n",
                                        opts.key, opts.valstr);
-                               ret = USAGE_ERROR;
+                               ret = BCME_USAGE_ERROR;
                                goto exit;
                        }
                }
@@ -752,20 +759,20 @@ dhd_sd_blocksize(void *dhd, cmd_t *cmd, char **argv)
 
        if (argc < 1 || argc > 2) {
                printf("required args: function [size] (size 0 means max)\n");
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        func = strtol(argv[1], &endptr, 0);
        if (*endptr != '\0') {
                printf("Invalid function: %s\n", argv[1]);
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        if (argc > 1) {
                size = strtol(argv[2], &endptr, 0);
                if (*endptr != '\0') {
                        printf("Invalid size: %s\n", argv[1]);
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
        }
 
@@ -800,7 +807,7 @@ dhd_sd_mode(void *wl, cmd_t *cmd, char **argv)
                } else if (!strcmp(argv[1], "sd4")) {
                        strcpy(argv[1], "2");
                } else {
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
 
                ret = dhd_var_setint(wl, cmd, argv);
@@ -848,7 +855,7 @@ dhd_dma_mode(void *wl, cmd_t *cmd, char **argv)
                } else if (!stricmp(argv[1], "adma2")) {
                        strcpy(argv[1], "3");
                } else {
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
 
                ret = dhd_var_setint(wl, cmd, argv);
@@ -891,13 +898,13 @@ dhd_sdreg(void *dhd, cmd_t *cmd, char **argv)
        /* required args: offset (will default size) */
        if (argc < 1) {
                printf("required args: offset[/size] [value]\n");
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        sdreg.offset = strtoul(argv[1], &ptr, 0);
        if (*ptr && *ptr != '/') {
                printf("Bad arg: %s\n", argv[1]);
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        /* read optional /size */
@@ -905,7 +912,7 @@ dhd_sdreg(void *dhd, cmd_t *cmd, char **argv)
                sdreg.func = strtol((ptr+1), &ptr, 0);
                if (*ptr || ((sdreg.func != 2) && sdreg.func != 4)) {
                        printf("Bad size option?\n");
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
        }
        else {
@@ -917,7 +924,7 @@ dhd_sdreg(void *dhd, cmd_t *cmd, char **argv)
                sdreg.value = strtoul(argv[2], &ptr, 0);
                if (*ptr) {
                        printf("Bad value: %s\n", argv[2]);
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
        }
 
@@ -983,36 +990,36 @@ dhd_membytes(void *dhd, cmd_t *cmd, char **argv)
        /* required args: address size [<data>]] */
        if (argc < 2) {
                fprintf(stderr, "required args: address size [<data>]\n");
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        if (argc < 3 && hexin) {
                fprintf(stderr, "missing <data> required by -h\n");
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
        if ((argc > 2) && (rawout)) {
                fprintf(stderr, "can't have <data> arg with -r\n");
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        /* read address */
        addr = strtoul(argv[0], &ptr, 0);
        if (*ptr) {
                fprintf(stderr, "Bad arg: %s\n", argv[0]);
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        /* read size */
        len = strtoul(argv[1], &ptr, 0);
        if (*ptr) {
                fprintf(stderr, "Bad value: %s\n", argv[1]);
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        align = addr & 0x03;
        if (align && argc > 2) {
                fprintf(stderr, "Can only write starting at long-aligned addresses.\n");
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        /* get can just use utility function, set must copy custom buffer */
@@ -1044,7 +1051,7 @@ dhd_membytes(void *dhd, cmd_t *cmd, char **argv)
                        char *inptr, *outptr;
                        if (patlen & 1) {
                                fprintf(stderr, "Hex (-h) must consist of whole bytes\n");
-                               ret = USAGE_ERROR;
+                               ret = BCME_USAGE_ERROR;
                                goto exit;
                        }
 
@@ -1056,7 +1063,7 @@ dhd_membytes(void *dhd, cmd_t *cmd, char **argv)
                                if (!isxdigit(n1) || !isxdigit(n2)) {
                                        fprintf(stderr, "invalid hex digit %c\n",
                                                (isxdigit(n1) ? n2 : n1));
-                                       ret = USAGE_ERROR;
+                                       ret = BCME_USAGE_ERROR;
                                        goto exit;
                                }
                                n1 = isdigit(n1) ? (n1 - '0')
@@ -1116,7 +1123,7 @@ dhd_idletime(void *dhd, cmd_t *cmd, char **argv)
                        idletime = strtol(argv[1], &endptr, 0);
                        if (*endptr != '\0') {
                                fprintf(stderr, "invalid number %s\n", argv[1]);
-                               err = -1;
+                               err = BCME_USAGE_ERROR;
                        }
                }
                if ((idletime < 0) && (idletime != DHD_IDLE_IMMEDIATE)) {
@@ -1165,7 +1172,7 @@ dhd_idleclock(void *dhd, cmd_t *cmd, char **argv)
                        idleclock = strtol(argv[1], &endptr, 0);
                        if (*endptr != '\0') {
                                fprintf(stderr, "invalid number %s\n", argv[1]);
-                               err = USAGE_ERROR;
+                               err = BCME_USAGE_ERROR;
                        }
                }
 
@@ -1228,7 +1235,7 @@ dhd_sprom(void *dhd, cmd_t *cmd, char **argv)
        if (strcmp(argv[0], "srdump") == 0) {
                if (argc) {
                        fprintf(stderr, "Command srdump doesn't take args\n");
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
                offset = 0;
                words = SPROM_WORDS;
@@ -1241,16 +1248,16 @@ dhd_sprom(void *dhd, cmd_t *cmd, char **argv)
 
                if (!ISALIGNED((uintptr)bufp, sizeof(uint16))) {
                        fprintf(stderr, "Internal error: unaligned word buffer\n");
-                       return COMMAND_ERROR;
+                       return BCME_ERROR;
                }
        } else {
                if (strcmp(argv[0], "srwrite") != 0) {
                        fprintf(stderr, "Unimplemented sprom command: %s\n", argv[0]);
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
 
                if (argc == 0) {
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                } else if ((argc == 1) ||
                           ((argc == 2) && ((nocrc = !strcmp(argv[1], "-c"))))) {
 
@@ -1258,7 +1265,7 @@ dhd_sprom(void *dhd, cmd_t *cmd, char **argv)
 
                        /* determine and validate file size */
                        if ((ret = file_size(fname)) < 0)
-                               return COMMAND_ERROR;
+                               return BCME_ERROR;
 
                        bytes = ret;
                        offset = 0;
@@ -1266,7 +1273,7 @@ dhd_sprom(void *dhd, cmd_t *cmd, char **argv)
 
                        if (bytes != 2 * SPROM_WORDS) {
                                fprintf(stderr, "Bad file size\n");
-                               return COMMAND_ERROR;
+                               return BCME_ERROR;
                        }
 
                        memcpy(bufp, &offset, sizeof(int));
@@ -1276,20 +1283,20 @@ dhd_sprom(void *dhd, cmd_t *cmd, char **argv)
 
                        if (!ISALIGNED((uintptr)bufp, sizeof(uint16))) {
                                fprintf(stderr, "Internal error: unaligned word buffer\n");
-                               return COMMAND_ERROR;
+                               return BCME_ERROR;
                        }
 
                        if ((fp = fopen(fname, "rb")) == NULL) {
                                fprintf(stderr, "Could not open %s: %s\n",
                                        fname, strerror(errno));
-                               return COMMAND_ERROR;
+                               return BCME_ERROR;
                        }
 
                        if (fread((uint16*)bufp, sizeof(uint16), words, fp) != words) {
                                fprintf(stderr, "Could not read %d bytes from %s\n",
                                        words * 2, fname);
                                fclose(fp);
-                               return COMMAND_ERROR;
+                               return BCME_ERROR;
                        }
 
                        fclose(fp);
@@ -1299,7 +1306,7 @@ dhd_sprom(void *dhd, cmd_t *cmd, char **argv)
                                fprintf(stderr, "CRC check failed: 0x%02x, should be 0x%02x.\n",
                                        ((uint8*)bufp)[bytes-1],
                                        ~hndcrc8((uint8*)bufp, bytes - 1, CRC8_INIT_VALUE) & 0xff);
-                               return COMMAND_ERROR;
+                               return BCME_ERROR;
                        }
 
                        ltoh16_buf(bufp, bytes);
@@ -1307,7 +1314,7 @@ dhd_sprom(void *dhd, cmd_t *cmd, char **argv)
                        offset = strtoul(*++argv, &endptr, 0) * 2;
                        if (*endptr != '\0') {
                                fprintf(stderr, "offset %s is not an integer\n", *argv);
-                               return USAGE_ERROR;
+                               return BCME_USAGE_ERROR;
                        }
 
                        memcpy(bufp, &offset, sizeof(int));
@@ -1317,18 +1324,18 @@ dhd_sprom(void *dhd, cmd_t *cmd, char **argv)
 
                        if (!ISALIGNED((uintptr)bufp, sizeof(uint16))) {
                                fprintf(stderr, "Internal error: unaligned word buffer\n");
-                               return COMMAND_ERROR;
+                               return BCME_ERROR;
                        }
 
                        for (words = 0, wordptr = (uint16*)bufp; *++argv; words++) {
                                *wordptr++ = (uint16)strtoul(*argv, &endptr, 0);
                                if (*endptr != '\0') {
                                        fprintf(stderr, "value %s is not an integer\n", *argv);
-                                       return USAGE_ERROR;
+                                       return BCME_USAGE_ERROR;
                                }
                                if (words > SPROM_WORDS) {
                                        fprintf(stderr, "max of %d words\n", SPROM_WORDS);
-                                       return USAGE_ERROR;
+                                       return BCME_USAGE_ERROR;
                                }
                        }
 
@@ -1522,7 +1529,7 @@ dhd_verify_file_bytes(void *dhd, uint8 *memblock, int start, uint len)
        if (ret) {
                fprintf(stderr, "%s: failed reading %d membytes from 0x%08x\n",
                __FUNCTION__, len, start);
-               return -1;
+               return ret;
        }
 
        src = (uint8 *)memblock;
@@ -1590,13 +1597,10 @@ failed_retry:
                if (ret) {
                        fprintf(stderr, "%s: error %d on writing %d membytes at 0x%08x\n",
                                __FUNCTION__, ret, len, start);
-                       return -1;
+                       return ret;
                }
 
                if (verify == TRUE) {
-                       if (len & 1)
-                               len = ROUNDUP(len, 2);
-
                        if (dhd_verify_file_bytes(dhd, memblock, start, len) != 0) {
                                if (retry++ < 5000)
                                {
@@ -1619,36 +1623,77 @@ static int
 dhd_proptxstatusenable(void *dhd, cmd_t *cmd, char **argv)
 {
        int flag = 0xdead;
+       int ret;
 
        if (argv[1]) {
                flag = atoi(argv[1]);
-               dhd_iovar_setint(dhd, cmd->name, flag);
+               ret = dhd_iovar_setint(dhd, cmd->name, flag);
        }
        else {
-               dhd_iovar_getint(dhd, cmd->name, &flag);
-               printf("proptxstatus: %d\n", flag);
+               ret = dhd_iovar_getint(dhd, cmd->name, &flag);
+               if (ret >= 0)
+                       printf("proptxstatus: %d\n", flag);
        }
-       return 0;
+       return ret;
 }
 
 static int
 dhd_proptxstatusmode(void *dhd, cmd_t *cmd, char **argv)
 {
        int mode = 0xdead;
+       int ret;
 
        if (argv[1]) {
                mode = atoi(argv[1]);
-               dhd_iovar_setint(dhd, cmd->name, mode);
+               ret = dhd_iovar_setint(dhd, cmd->name, mode);
        }
        else {
-               dhd_iovar_getint(dhd, cmd->name, &mode);
-               printf("proptxstatusmode: %d\n", mode);
+               ret = dhd_iovar_getint(dhd, cmd->name, &mode);
+               if (ret >= 0)
+                       printf("proptxstatusmode: %d\n", mode);
        }
-       return 0;
+       return ret;
 }
+
+static int
+dhd_proptxopt(void *dhd, cmd_t *cmd, char **argv)
+{
+       int flag = 0xdead;
+       int ret;
+
+       if (argv[1]) {
+               flag = atoi(argv[1]);
+               ret = dhd_iovar_setint(dhd, cmd->name, flag);
+       }
+       else {
+               ret = dhd_iovar_getint(dhd, cmd->name, &flag);
+               if (ret >= 0)
+                       printf("proptx_opt: %d\n", flag);
+       }
+       return ret;
+}
+
 #endif /* PROP_TXSTATUS */
 
 static int
+dhd_get_ramstart(void *dhd, uint32 *ramstart)
+{
+       int ret;
+       char *ramstart_args[] = {"ramstart", NULL};
+
+       /* Read the bus type the DHD driver is associated to */
+       if ((ret = dhd_var_get(dhd, NULL, ramstart_args)) != BCME_OK) {
+               fprintf(stderr, "%s: error obtaining ramstart\n", __FUNCTION__);
+
+               return ret;
+       }
+
+       *ramstart = *(uint32 *)buf;
+
+       return BCME_OK;
+}
+
+static int
 dhd_download(void *dhd, cmd_t *cmd, char **argv)
 {
 #if !defined(BWL_FILESYSTEM_SUPPORT)
@@ -1659,15 +1704,15 @@ dhd_download(void *dhd, cmd_t *cmd, char **argv)
        bool verify = FALSE;
        char *fname = NULL;
        char *vname = NULL;
-       uint32 start = 0;
+       uint32 start;
        int ret = 0;
        int fsize;
        uint32 bustype;
        long filepos;
 
        FILE *fp = NULL;
-       uint32 memsize;
-       char *memszargs[] = { "memsize", NULL };
+       uint32 ramsize;
+       char *memszargs[] = { "ramsize", NULL };
 
        char *bufp;
 
@@ -1682,6 +1727,9 @@ dhd_download(void *dhd, cmd_t *cmd, char **argv)
 
        UNUSED_PARAMETER(cmd);
 
+       if ((ret = dhd_get_ramstart(dhd, &start)) != BCME_OK)
+               goto exit;
+
        /* Parse command-line options */
        miniopt_init(&opts, "download", "", TRUE);
 
@@ -1788,14 +1836,14 @@ dhd_download(void *dhd, cmd_t *cmd, char **argv)
 
        if (bustype == BUS_TYPE_SDIO) {
                if ((ret = dhd_var_get(dhd, NULL, memszargs))) {
-                       fprintf(stderr, "%s: error obtaining memsize\n", __FUNCTION__);
+                       fprintf(stderr, "%s: error obtaining ramsize\n", __FUNCTION__);
                        goto exit;
                }
-               memsize = *(uint32*)buf;
+               ramsize = *(uint32*)buf;
        }
 
 
-       BCM_REFERENCE(memsize);
+       BCM_REFERENCE(ramsize);
 
        /* do the download reset if not suppressed */
        if (reset) {
@@ -1805,6 +1853,8 @@ dhd_download(void *dhd, cmd_t *cmd, char **argv)
                        goto exit;
                }
        }
+       
+#define RDL_CHUNK      1500  /* size of each dl transfer */
 
        if (BUS_TYPE_USB == bustype) {
                /* store the cur pos pointing to base image which should be written */
@@ -1824,10 +1874,9 @@ dhd_download(void *dhd, cmd_t *cmd, char **argv)
 
 
        /* Load the ram image */
-       if (dhd_load_file_bytes(dhd, cmd, fp, fsize, start, memblock_sz, verify)) {
+       if ((ret = dhd_load_file_bytes(dhd, cmd, fp, fsize, start, memblock_sz, verify))) {
                fprintf(stderr, "%s: error loading the ramimage at addr 0x%x\n",
                        __FUNCTION__, start);
-               ret = -1;
                goto exit;
        }
 
@@ -1889,7 +1938,6 @@ dhd_download(void *dhd, cmd_t *cmd, char **argv)
                }
        }
        if (embedded_ucode) {
-/* GREG remove */      
        }
 
 exit:
@@ -1907,13 +1955,13 @@ dhd_dldn(void *dhd, cmd_t *cmd, char **argv)
        return (-1);
 #else
        char *fname = NULL;
-       uint32 start = 0;
+       uint32 start;
        int ret = 0;
        int fsize;
        int fd = 0;
 
        FILE *fp = NULL;
-       uint32 memsize;
+       uint32 ramsize;
 
        uint len;
        uint8 memblock[MEMBLOCK];
@@ -1970,11 +2018,11 @@ dhd_dldn(void *dhd, cmd_t *cmd, char **argv)
                goto exit;
        }
 
-       memsize = 393216;
+       ramsize = 393216;
 
-       if (memsize && ((uint32)fsize > memsize)) {
+       if (ramsize && ((uint32)fsize > ramsize)) {
                fprintf(stderr, "%s: file %s too large (%d > %d)\n",
-                       __FUNCTION__, fname, fsize, memsize);
+                       __FUNCTION__, fname, fsize, ramsize);
                ret = -1;
                goto exit;
        }
@@ -1987,6 +2035,9 @@ dhd_dldn(void *dhd, cmd_t *cmd, char **argv)
                goto exit;
        }
 
+       if ((ret = dhd_get_ramstart(dhd, &start)) != BCME_OK)
+               goto exit;
+
        while ((len = fread(memblock, sizeof(uint8), MEMBLOCK, fp))) {
                if (len < MEMBLOCK && !feof(fp)) {
                        fprintf(stderr, "%s: error reading file %s\n", __FUNCTION__, fname);
@@ -2017,7 +2068,7 @@ exit:
                fclose(fp);
 
        if (fd)
-               dhd_set(dhd, DHD_DLDN_END, NULL, 0);
+               ret = dhd_set(dhd, DHD_DLDN_END, NULL, 0);
 
        return ret;
 #endif /* BWL_FILESYSTEM_SUPPORT */
@@ -2030,13 +2081,13 @@ dhd_upload(void *dhd, cmd_t *cmd, char **argv)
        return (-1);
 #else
        char *fname = NULL;
-       uint32 start = 0;
+       uint32 start;
        uint32 size = 0;
        int ret = 0;
 
        FILE *fp;
-       uint32 memsize;
-       char *memszargs[] = { "memsize", NULL };
+       uint32 ramsize;
+       char *memszargs[] = { "ramsize", NULL };
 
        uint len;
 
@@ -2046,6 +2097,9 @@ dhd_upload(void *dhd, cmd_t *cmd, char **argv)
        UNUSED_PARAMETER(cmd);
        UNUSED_PARAMETER(argv);
 
+       if ((ret = dhd_get_ramstart(dhd, &start)) != BCME_OK)
+               goto exit;
+
        /* Parse command-line options */
        miniopt_init(&opts, "upload", "", TRUE);
 
@@ -2094,20 +2148,13 @@ dhd_upload(void *dhd, cmd_t *cmd, char **argv)
        }
 
        if ((ret = dhd_var_get(dhd, NULL, memszargs))) {
-               fprintf(stderr, "%s: error obtaining memsize\n", __FUNCTION__);
+               fprintf(stderr, "%s: error obtaining ramsize\n", __FUNCTION__);
                goto exit;
        }
-       memsize = *(uint32*)buf;
+       ramsize = *(uint32*)buf;
 
-       if (!memsize)
-               memsize = start + size;
-
-       if (start + size > memsize) {
-               fprintf(stderr, "%s: %d bytes at 0x%x exceeds ramsize 0x%x\n",
-                       __FUNCTION__, size, start, memsize);
-               ret = -1;
-               goto exit;
-       }
+       if (!ramsize)
+               ramsize = start + size;
 
        if ((fp = fopen(fname, "wb")) == NULL) {
                fprintf(stderr, "%s: Could not open %s: %s\n",
@@ -2118,7 +2165,7 @@ dhd_upload(void *dhd, cmd_t *cmd, char **argv)
 
        /* default size to full RAM */
        if (!size)
-               size = memsize - start;
+               size = ramsize - start;
 
        /* read memory and write to file */
        while (size) {
@@ -2136,7 +2183,7 @@ dhd_upload(void *dhd, cmd_t *cmd, char **argv)
                        break;
                }
 
-               if (fwrite(ptr, sizeof(*ptr), len, fp) != len) {
+               if (fwrite(ptr, sizeof(char), len, fp) != len) {
                        fprintf(stderr, "%s: error writing to file %s\n", __FUNCTION__, fname);
                        ret = -1;
                        break;
@@ -2152,6 +2199,332 @@ exit:
 #endif /* BWL_FILESYSTEM_SUPPORT */
 }
 
+#ifdef BWL_FILESYSTEM_SUPPORT
+static int
+dhd_get_debug_info(void *dhd, hndrte_debug_t *debug_info)
+{
+       int i;
+       int ret;
+       int params[2];
+
+       uint32 *buffer;
+       uint32 debug_info_ptr;
+       uint32 ramstart;
+
+       if ((ret = dhd_get_ramstart(dhd, &ramstart)) != BCME_OK)
+               return ret;
+
+       /*
+        * Different chips have different fixed debug_info_ptrs
+        * because of different ROM locations/uses.  Try them all looking
+        * for the magic number.
+        */
+       for (i = 0; ; i++) {
+               if (debug_info_ptrs[i] == DEBUG_INFO_PTRS_END) {
+                       fprintf(stderr, "Error: cannot find pointer to debug_info\n");
+                       return -1;
+               }
+
+               params[0] = debug_info_ptrs[i] + ramstart;
+               params[1] = 8;
+               ret = dhd_var_getbuf(dhd, "membytes", params, 2 * sizeof(int), (void**)&buffer);
+               if ((ret == 0) &&
+                   (*buffer == HNDRTE_DEBUG_PTR_PTR_MAGIC)) {
+                       break;
+               }
+       }
+
+       debug_info_ptr = *(buffer + 1);
+       if (debug_info_ptr == 0) {
+               fprintf(stderr, "Error: Debug info pointer is zero\n");
+               return -1;
+       }
+
+       /* Read the area the debuginfoptr points at */
+       params[0] = debug_info_ptr;
+       params[1] = sizeof(hndrte_debug_t);
+       ret = dhd_var_getbuf(dhd, "membytes", params, 2 * sizeof(int), (void**)&buffer);
+       if (ret) {
+               fprintf(stderr, "%s: failed reading %lu membytes from 0x%08lx\n",
+                       __FUNCTION__, (long unsigned) params[1], (long unsigned) params[0]);
+               return ret;
+       }
+
+       memcpy((char *) debug_info, buffer, sizeof(hndrte_debug_t));
+
+       /* Sanity check the area */
+       if ((debug_info->magic != HNDRTE_DEBUG_MAGIC) ||
+           (debug_info->version != HNDRTE_DEBUG_VERSION)) {
+               fprintf(stderr, "Error: Invalid debug info area\n");
+               return -1;
+       }
+
+       return 0;
+}
+#endif /* BWL_FILESYSTEM_SUPPORT */
+
+static int
+dhd_coredump(void *dhd, cmd_t *cmd, char **argv)
+{
+#if !defined(BWL_FILESYSTEM_SUPPORT)
+       return (-1);
+#else
+       char *fname = NULL;
+       int ret;
+
+       FILE *fp;
+
+       hndrte_debug_t debugInfo;
+
+       miniopt_t opts;
+       int opt_err;
+
+       int params[2];
+       char *ptr;
+
+       unsigned int start;
+       unsigned int size;
+
+       prstatus_t prstatus;
+
+       UNUSED_PARAMETER(cmd);
+       UNUSED_PARAMETER(argv);
+
+       /* Parse command-line options */
+       miniopt_init(&opts, "dump", "", TRUE);
+
+       argv++;
+       while ((opt_err = miniopt(&opts, argv)) != -1) {
+               if (opt_err == 1) {
+                       fprintf(stderr, "dump options error\n");
+                       ret = -1;
+                       goto exit;
+               }
+               argv += opts.consumed;
+
+               if (opts.positional) {
+                       if (!fname) {
+                               fname = opts.valstr;
+                       } else {
+                               fprintf(stderr, "dump options error\n");
+                               ret = -1;
+                               goto exit;
+                       }
+               } else if (!opts.opt) {
+                       fprintf(stderr, "unrecognized option %s\n", opts.valstr);
+                       ret = -1;
+                       goto exit;
+               } else {
+                       fprintf(stderr, "unrecognized option %c\n", opts.opt);
+                       ret = -1;
+                       goto exit;
+               }
+       }
+
+       /* validate arguments */
+       if (!fname) {
+               fprintf(stderr, "filename required\n");
+               ret = -1;
+               goto exit;
+       }
+
+       if ((ret = dhd_get_debug_info(dhd, &debugInfo)) < 0)
+               goto exit;
+
+       /* Get the base and size to dump */
+       start = debugInfo.ram_base;
+       size = debugInfo.ram_size;
+
+       /* Get the arm trap area */
+       bzero(&prstatus, sizeof(prstatus_t));
+       if (debugInfo.trap_ptr != 0) {
+               int i;
+               trap_t armtrap;
+               uint32 *reg;
+
+               params[0] = debugInfo.trap_ptr;
+               params[1] = sizeof(trap_t);
+               ret = dhd_var_getbuf(dhd, "membytes", params, 2 * sizeof(int), (void**)&ptr);
+               if (ret) {
+                       fprintf(stderr, "%s: failed reading %lu membytes from 0x%08lx\n",
+                               __FUNCTION__, (long unsigned) params[1], (long unsigned) params[0]);
+                       goto exit;
+               }
+
+               memcpy((char *) &armtrap, ptr, sizeof(trap_t));
+
+               /* Populate the prstatus */
+               prstatus.si_signo = armtrap.type;
+               reg = &armtrap.r0;
+               for (i = 0; i < 15; i++, reg++) {
+                       prstatus.uregs[i] = *reg;
+               }
+               prstatus.uregs[15] = armtrap.epc;
+       }
+
+       if ((fp = fopen(fname, "wb")) == NULL) {
+               fprintf(stderr, "%s: Could not open %s: %s\n",
+                       __FUNCTION__, fname, strerror(errno));
+               ret = -1;
+               goto exit;
+       }
+
+       /* Write the preamble and debug header */
+       fprintf(fp, "Dump starts for version %s FWID 01-%x\n", debugInfo.epivers, debugInfo.fwid);
+       fprintf(fp, "XXXXXXXXXXXXXXXXXXXX");
+       fprintf(fp, "%8.8lX", (long unsigned) sizeof(debugInfo));
+       if (fwrite(&debugInfo, sizeof(unsigned char), sizeof(debugInfo), fp) != sizeof(debugInfo)) {
+               fprintf(stderr, "%s: error writing to file %s\n", __FUNCTION__, fname);
+               ret = -1;
+               fclose(fp);
+               goto exit;
+       }
+
+       /* Write the prstatus */
+       if (fwrite(&prstatus, sizeof(unsigned char), sizeof(prstatus), fp) != sizeof(prstatus)) {
+               fprintf(stderr, "%s: error writing to file %s\n", __FUNCTION__, fname);
+               ret = -1;
+               fclose(fp);
+               goto exit;
+       }
+
+       /* Write the ram size as another sanity check */
+       fprintf(fp, "%8.8X", size);
+
+       /* read memory and write to file */
+       while (size) {
+               int len;
+               len = MIN(MEMBLOCK, size);
+
+               params[0] = start;
+               params[1] = len;
+               ret = dhd_var_getbuf(dhd, "membytes", params, 2 * sizeof(int), (void**)&ptr);
+               if (ret) {
+                       fprintf(stderr, "%s: failed reading %d membytes from 0x%08x\n",
+                               __FUNCTION__, len, start);
+                       break;
+               }
+
+               if (fwrite(ptr, sizeof(char), len, fp) != (uint) len) {
+                       fprintf(stderr, "%s: error writing to file %s\n", __FUNCTION__, fname);
+                       ret = -1;
+                       break;
+               }
+
+               start += len;
+               size -= len;
+       }
+
+       fclose(fp);
+exit:
+       return ret;
+#endif /* BWL_FILESYSTEM_SUPPORT */
+}
+
+static int
+dhd_consoledump(void *dhd, cmd_t *cmd, char **argv)
+{
+#if !defined(BWL_FILESYSTEM_SUPPORT)
+       return (-1);
+#else
+       int ret;
+
+       hndrte_debug_t debugInfo;
+
+       miniopt_t opts;
+       int opt_err;
+
+       int params[2];
+       char *ptr;
+
+       unsigned int start;
+       unsigned int size;
+       int len;
+
+       UNUSED_PARAMETER(cmd);
+       UNUSED_PARAMETER(argv);
+
+       /* Parse command-line options */
+       miniopt_init(&opts, "consoledump", "", TRUE);
+
+       argv++;
+       while ((opt_err = miniopt(&opts, argv)) != -1) {
+               if (opt_err == 1) {
+                       fprintf(stderr, "dump options error\n");
+                       ret = -1;
+                       goto exit;
+               }
+               argv += opts.consumed;
+
+               if (!opts.opt) {
+                       fprintf(stderr, "unrecognized option %s\n", opts.valstr);
+                       ret = -1;
+                       goto exit;
+               } else {
+                       fprintf(stderr, "unrecognized option %c\n", opts.opt);
+                       ret = -1;
+                       goto exit;
+               }
+       }
+
+       if ((ret = dhd_get_debug_info(dhd, &debugInfo)) < 0)
+               goto exit;
+
+       if (debugInfo.console <= debugInfo.ram_base) {
+               fprintf(stderr, "%s: console not found\n", __FUNCTION__);
+               ret = -1;
+               goto exit;
+       }
+
+       /* Get the debug console area */
+       params[0] = debugInfo.console;
+       params[1] = sizeof(hndrte_cons_t);
+       ret = dhd_var_getbuf(dhd, "membytes", params, 2 * sizeof(int), (void**)&ptr);
+       if (ret) {
+               fprintf(stderr, "%s: failed reading %lu membytes from 0x%08lx\n",
+                       __FUNCTION__, (long unsigned) params[1], (long unsigned) params[0]);
+               goto exit;
+       }
+
+       if (ptr == NULL) {
+               fprintf(stderr, "%s: console not initialised\n", __FUNCTION__);
+               ret = -1;
+               goto exit;
+       }
+
+       start = (unsigned int)((hndrte_cons_t *)ptr)->log.buf;
+       size = ((hndrte_cons_t *)ptr)->log.buf_size;
+
+       if (start <= debugInfo.ram_base) {
+               fprintf(stderr, "%s: console buffer not initialised\n", __FUNCTION__);
+               ret = -1;
+               goto exit;
+       }
+
+       /* read memory and write to file */
+       while (size > 0) {
+               len = MIN(MEMBLOCK, size);
+
+               params[0] = start;
+               params[1] = len;
+               ret = dhd_var_getbuf(dhd, "membytes", params, 2 * sizeof(int), (void**)&ptr);
+               if (ret) {
+                       fprintf(stderr, "%s: failed reading %d membytes from 0x%08x\n",
+                               __FUNCTION__, len, start);
+                       break;
+               }
+
+               printf("%s", ptr);
+
+               start += len;
+               size -= len;
+       }
+
+exit:
+       return ret;
+#endif /* BWL_FILESYSTEM_SUPPORT */
+}
+
 static int
 dhd_logstamp(void *dhd, cmd_t *cmd, char **argv)
 {
@@ -2165,13 +2538,13 @@ dhd_logstamp(void *dhd, cmd_t *cmd, char **argv)
        argc--; argv++;
 
        if (argc > 2)
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
 
        if (argc) {
                valn[0] = strtol(argv[0], &endptr, 0);
                if (*endptr != '\0') {
                        printf("bad val1: %s\n", argv[0]);
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
        }
 
@@ -2179,7 +2552,7 @@ dhd_logstamp(void *dhd, cmd_t *cmd, char **argv)
                valn[1] = strtol(argv[1], &endptr, 0);
                if (*endptr != '\0') {
                        printf("bad val2: %s\n", argv[1]);
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
        }
 
@@ -2208,29 +2581,29 @@ dhd_sd_reg(void *dhd, cmd_t *cmd, char **argv)
                argv++;
                if (argc < 1) {
                        printf("required args: offset [value]\n");
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
 
        } else if (!strcmp(cmd->name, "sd_devreg")) {
                argv++;
                if (argc < 2) {
                        printf("required args: func offset [value]\n");
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
 
                sdreg.func = strtoul(*argv++, &endptr, 0);
                if (*endptr != '\0') {
                        printf("Invalid function number\n");
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
        } else {
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        sdreg.offset = strtoul(*argv++, &endptr, 0);
        if (*endptr != '\0') {
                printf("Invalid offset value\n");
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        /* third arg: value */
@@ -2238,7 +2611,7 @@ dhd_sd_reg(void *dhd, cmd_t *cmd, char **argv)
                sdreg.value = strtoul(*argv, &endptr, 0);
                if (*endptr != '\0') {
                        printf("Invalid value\n");
-                       return USAGE_ERROR;
+                       return BCME_USAGE_ERROR;
                }
        }
 
@@ -2404,19 +2777,19 @@ dhd_var_setint(void *dhd, cmd_t *cmd, char **argv)
 
        if (cmd->set == -1) {
                printf("set not defined for %s\n", cmd->name);
-               return COMMAND_ERROR;
+               return BCME_ERROR;
        }
 
        if (!*argv) {
                printf("set: missing arguments\n");
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        varname = *argv++;
 
        if (!*argv) {
                printf("set: missing value argument for set of \"%s\"\n", varname);
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        val = strtol(*argv, &endptr, 0);
@@ -2424,7 +2797,7 @@ dhd_var_setint(void *dhd, cmd_t *cmd, char **argv)
                /* not all the value string was parsed by strtol */
                printf("set: error parsing value \"%s\" as an integer for set of \"%s\"\n",
                        *argv, varname);
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        strcpy(buf, varname);
@@ -2453,14 +2826,14 @@ dhd_var_get(void *dhd, cmd_t *cmd, char **argv)
 
        if (!*argv) {
                printf("get: missing arguments\n");
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        varname = *argv++;
 
        if (*argv) {
                printf("get: error, extra arg \"%s\"\n", *argv);
-               return USAGE_ERROR;
+               return BCME_USAGE_ERROR;
        }
 
        strcpy(buf, varname);
@@ -2479,7 +2852,7 @@ dhd_var_getint(void *dhd, cmd_t *cmd, char **argv)
        int32 val;
        if (cmd->get == -1) {
                printf("get not defined for %s\n", cmd->name);
-               return COMMAND_ERROR;
+               return BCME_ERROR;
        }
 
        if ((err = dhd_var_get(dhd, cmd, argv)))
@@ -2573,7 +2946,7 @@ dhd_var_void(void *dhd, cmd_t *cmd, char **argv)
        UNUSED_PARAMETER(argv);
 
        if (cmd->set < 0)
-               return USAGE_ERROR;
+               return BCME_ERROR;
 
        return dhd_var_setbuf(dhd, cmd->name, NULL, 0);
 }
@@ -2690,136 +3063,6 @@ dhd_hostreorder_flows(void *dhd, cmd_t *cmd, char **argv)
 }
 
 
-#ifdef WLBTAMP
-
-#define MATCH_OP(op, opstr)    (strlen(op) == strlen(opstr) && strncmp(op, opstr, strlen(op)) == 0)
-
-static int
-wl_HCI_cmd(void *wl, cmd_t *cmd, char **argv)
-{
-       union {
-               char buf[HCI_CMD_PREAMBLE_SIZE + HCI_CMD_DATA_SIZE];
-               uint32 alignme;
-       } cbuf;
-       amp_hci_cmd_t *cpkt = (amp_hci_cmd_t *)&cbuf.buf[0];
-
-       char *op;
-       uint8 plen;
-
-       UNUSED_PARAMETER(cmd);
-
-       if (!*++argv)
-               return USAGE_ERROR;
-
-       /* recognize and encode operations */
-       op = *argv++;
-       if (MATCH_OP(op, "Read_Link_Quality")) {
-               cpkt->opcode = HCI_Read_Link_Quality;
-       } else if (MATCH_OP(op, "Read_Local_AMP_Info")) {
-               cpkt->opcode = HCI_Read_Local_AMP_Info;
-       } else if (MATCH_OP(op, "Read_Local_AMP_ASSOC")) {
-               cpkt->opcode = HCI_Read_Local_AMP_ASSOC;
-       } else if (MATCH_OP(op, "Write_Remote_AMP_ASSOC")) {
-               cpkt->opcode = HCI_Write_Remote_AMP_ASSOC;
-       } else if (MATCH_OP(op, "Create_Physical_Link")) {
-               cpkt->opcode = HCI_Create_Physical_Link;
-       } else if (MATCH_OP(op, "Accept_Physical_Link_Request")) {
-               cpkt->opcode = HCI_Accept_Physical_Link_Request;
-       } else if (MATCH_OP(op, "Disconnect_Physical_Link")) {
-               cpkt->opcode = HCI_Disconnect_Physical_Link;
-       } else if (MATCH_OP(op, "Create_Logical_Link")) {
-               cpkt->opcode = HCI_Create_Logical_Link;
-       } else if (MATCH_OP(op, "Accept_Logical_Link")) {
-               cpkt->opcode = HCI_Accept_Logical_Link;
-       } else if (MATCH_OP(op, "Disconnect_Logical_Link")) {
-               cpkt->opcode = HCI_Disconnect_Logical_Link;
-       } else if (MATCH_OP(op, "Logical_Link_Cancel")) {
-               cpkt->opcode = HCI_Logical_Link_Cancel;
-       } else if (MATCH_OP(op, "Short_Range_Mode")) {
-               cpkt->opcode = HCI_Short_Range_Mode;
-       } else if (MATCH_OP(op, "Read_Connection_Accept_Timeout")) {
-               cpkt->opcode = HCI_Read_Connection_Accept_Timeout;
-       } else if (MATCH_OP(op, "Write_Connection_Accept_Timeout")) {
-               cpkt->opcode = HCI_Write_Connection_Accept_Timeout;
-       } else if (MATCH_OP(op, "Read_Link_Supervision_Timeout")) {
-               cpkt->opcode = HCI_Read_Link_Supervision_Timeout;
-       } else if (MATCH_OP(op, "Write_Link_Supervision_Timeout")) {
-               cpkt->opcode = HCI_Write_Link_Supervision_Timeout;
-       } else if (MATCH_OP(op, "Reset")) {
-               cpkt->opcode = HCI_Reset;
-       } else if (MATCH_OP(op, "Enhanced_Flush")) {
-               cpkt->opcode = HCI_Enhanced_Flush;
-       } else if (MATCH_OP(op, "Read_Best_Effort_Flush_Timeout")) {
-               cpkt->opcode = HCI_Read_Best_Effort_Flush_Timeout;
-       } else if (MATCH_OP(op, "Write_Best_Effort_Flush_Timeout")) {
-               cpkt->opcode = HCI_Write_Best_Effort_Flush_Timeout;
-       } else if (MATCH_OP(op, "Read_Logical_Link_Accept_Timeout")) {
-               cpkt->opcode = HCI_Read_Logical_Link_Accept_Timeout;
-       } else if (MATCH_OP(op, "Write_Logical_Link_Accept_Timeout")) {
-               cpkt->opcode = HCI_Write_Logical_Link_Accept_Timeout;
-       } else if (MATCH_OP(op, "Read_Buffer_Size")) {
-               cpkt->opcode = HCI_Read_Buffer_Size;
-       } else if (MATCH_OP(op, "Read_Data_Block_Size")) {
-               cpkt->opcode = HCI_Read_Data_Block_Size;
-       } else if (MATCH_OP(op, "Set_Event_Mask_Page_2")) {
-               cpkt->opcode = HCI_Set_Event_Mask_Page_2;
-       } else if (MATCH_OP(op, "Flow_Spec_Modify")) {
-               cpkt->opcode = HCI_Flow_Spec_Modify;
-       } else if (MATCH_OP(op, "Read_Local_Version_Info")) {
-               cpkt->opcode = HCI_Read_Local_Version_Info;
-       } else if (MATCH_OP(op, "Read_Local_Supported_Commands")) {
-               cpkt->opcode = HCI_Read_Local_Supported_Commands;
-       } else if (MATCH_OP(op, "Read_Failed_Contact_Counter")) {
-               cpkt->opcode = HCI_Read_Failed_Contact_Counter;
-       } else if (MATCH_OP(op, "Reset_Failed_Contact_Counter")) {
-               cpkt->opcode = HCI_Reset_Failed_Contact_Counter;
-       } else {
-               printf("unsupported HCI command: %s\n", op);
-               return (-1);
-       }
-
-       plen = 0;
-       while (*argv && (plen < HCI_CMD_DATA_SIZE)) {
-               cpkt->parms[plen++] = (uint8)strtol(*argv++, NULL, 0);
-       }
-       cpkt->plen = plen;
-
-       return dhd_var_setbuf(wl, cmd->name, cpkt, HCI_CMD_PREAMBLE_SIZE + plen);
-}
-
-typedef union {
-       uint8 buf[HCI_ACL_DATA_PREAMBLE_SIZE + 2048];
-       uint32 alignme;
-} g_hci_dbuf_t;
-
-static int
-wl_HCI_ACL_data(void *wl, cmd_t *cmd, char **argv)
-{
-       /* Align struct. Also declare static so that large array isn't allocated
-        * from the stack.
-        */
-       static g_hci_dbuf_t g_hci_dbuf;
-
-       amp_hci_ACL_data_t *dpkt = (amp_hci_ACL_data_t *)&g_hci_dbuf.buf[0];
-       uint16 dlen;
-
-       if (!*++argv)
-               return USAGE_ERROR;
-
-       /* get logical link handle */
-       dpkt->handle = (HCI_ACL_DATA_BC_FLAGS | HCI_ACL_DATA_PB_FLAGS);
-       dpkt->handle |= (uint16)strtol(*argv++, NULL, 0);
-
-       /* get data */
-       dlen = 0;
-       while (*argv && (dlen < 2048)) {
-               dpkt->data[dlen++] = (uint8)strtol(*argv++, NULL, 0);
-       }
-       dpkt->dlen = dlen;
-
-       return dhd_var_setbuf(wl, cmd->name, dpkt, HCI_ACL_DATA_PREAMBLE_SIZE + dlen);
-}
-#endif /* WLBTAMP */
 
 /* These two utility functions are used by dhdu_linux.c
  * The code is taken from wlu.c.
index dbda436..1792029 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Definitions for DHD command-line utility
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  * 
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -15,7 +15,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: dhdu.h 294362 2011-11-06 22:26:56Z $
+ * $Id: dhdu.h 379386 2013-01-17 07:20:55Z $
  */
 
 #ifndef _dhdu_h_
@@ -46,10 +46,6 @@ struct ipv4_addr;
 int dhd_ether_atoe(const char *a, struct ether_addr *n);
 int dhd_atoip(const char *a, struct ipv4_addr *n);
 
-#define USAGE_ERROR    -1      /* Error code for Usage */
-#define IOCTL_ERROR    -2      /* Error code for ioctl failure */
-#define COMMAND_ERROR  -3      /* Error code for general command failure */
-
 /* integer output format */
 #define INT_FMT_DEC    0       /* signed integer */
 #define INT_FMT_UINT   1       /* unsigned integer */
index 74c6304..9fb2353 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Command structure for dhd command line utility, copied from wl utility
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  * 
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
index 6ea2ca2..90d6846 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Linux port of dhd command line utility, hacked from wl utility.
  *
- * Copyright (C) 2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -15,7 +15,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: dhdu_common.h 308298 2012-01-14 01:35:34Z $
+ * $Id: dhdu_common.h 379386 2013-01-17 07:20:55Z $
  */
 
 /* Common header file for dhdu_linux.c and dhdu_ndis.c */
@@ -46,7 +46,6 @@
 #define SUCCESS        1
 #define FAIL                   -1
 #define NO_PACKET       -2
-#define SERIAL_PORT_ERR -3
 
 /* Added for debug utility support */
 #define ERR            stderr
index 146240f..9e24185 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Linux port of dhd command line utility, hacked from wl utility.
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  * 
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -15,7 +15,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: dhdu_linux.c 308298 2012-01-14 01:35:34Z $
+ * $Id: dhdu_linux.c 378962 2013-01-15 13:18:28Z $
  */
 
 #include <stdio.h>
@@ -68,6 +68,7 @@ typedef u_int8_t u8;
 #include <netinet/in.h>
 #include <dhdioctl.h>
 #include "dhdu_common.h"
+#include "dhdu_nl80211.h"
 
 char *av0;
 static int rwl_os_type = LINUX_OS;
@@ -86,23 +87,66 @@ dhd_find_cmd(char* name)
 }
 
 static void
-syserr(char *s)
+syserr(const char *s)
 {
-       fprintf(stderr, "%s: ", dhdu_av0);
+       fprintf(stderr, "%s: ", av0);
        perror(s);
        exit(errno);
 }
 
+#ifdef NL80211
+static int __dhd_driver_io(void *dhd, dhd_ioctl_t *ioc)
+{
+       struct dhd_netlink_info dhd_nli;
+       struct ifreq *ifr = (struct ifreq *)dhd;
+       int ret = 0;
+
+       dhd_nli.ifidx = if_nametoindex(ifr->ifr_name);
+       if (!dhd_nli.ifidx) {
+               fprintf(stderr, "invalid device %s\n", ifr->ifr_name);
+               return BCME_IOCTL_ERROR;
+       }
+
+       if (dhd_nl_sock_connect(&dhd_nli) < 0)
+               syserr("socket");
+
+       ret = dhd_nl_do_testmode(&dhd_nli, ioc);
+       dhd_nl_sock_disconnect(&dhd_nli);
+       return ret;
+}
+#else
+static int __dhd_driver_io(void *dhd, dhd_ioctl_t *ioc)
+{
+       struct ifreq *ifr = (struct ifreq *)dhd;
+       int s;
+       int ret = 0;
+
+       /* pass ioctl data */
+       ifr->ifr_data = (caddr_t)ioc;
+
+       /* open socket to kernel */
+       if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+               syserr("socket");
+
+       ret = ioctl(s, SIOCDEVPRIVATE, ifr);
+       if (ret < 0 && errno != EAGAIN)
+               syserr(__FUNCTION__);
+
+       /* cleanup */
+       close(s);
+       return ret;
+}
+#endif /* NL80211 */
+
 /* This function is called by ioctl_setinformation_fe or ioctl_queryinformation_fe
  * for executing  remote commands or local commands
  */
 static int
 dhd_ioctl(void *dhd, int cmd, void *buf, int len, bool set)
 {
-       struct ifreq *ifr = (struct ifreq *)dhd;
        dhd_ioctl_t ioc;
        int ret = 0;
-       int s;
+
        /* By default try to execute wl commands */
        int driver_magic = WLC_IOCTL_MAGIC;
        int get_magic = WLC_GET_MAGIC;
@@ -117,26 +161,16 @@ dhd_ioctl(void *dhd, int cmd, void *buf, int len, bool set)
                get_magic = DHD_GET_MAGIC;
        }
 
-       /* open socket to kernel */
-       if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
-               syserr("socket");
-
        /* do it */
        ioc.cmd = cmd;
        ioc.buf = buf;
        ioc.len = len;
        ioc.set = set;
        ioc.driver = driver_magic;
-       ifr->ifr_data = (caddr_t) &ioc;
 
-       if ((ret = ioctl(s, SIOCDEVPRIVATE, ifr)) < 0) {
-               if (cmd != get_magic) {
-                       ret = IOCTL_ERROR;
-               }
-       }
-
-       /* cleanup */
-       close(s);
+       ret = __dhd_driver_io(dhd, &ioc);
+       if (ret < 0 && cmd != get_magic)
+               ret = BCME_IOCTL_ERROR;
        return ret;
 }
 
@@ -174,9 +208,8 @@ dhd_get_dev_type(char *name, void *buf, char *type)
        strncpy(ifr.ifr_name, name, IFNAMSIZ);
        if ((ret = ioctl(s, SIOCETHTOOL, &ifr)) < 0) {
 
-               /* print a good diagnostic if not superuser */
-               if (errno == EPERM)
-                       syserr("dhd_get_dev_type");
+               if (errno != EAGAIN)
+                       syserr(__FUNCTION__);
 
                *(char *)buf = '\0';
        }
@@ -319,7 +352,7 @@ ioctl_queryinformation_fe(void *wl, int cmd, void* input_buf, int *input_len)
                        (unsigned long*)input_len, 0, RDHD_GET_IOCTL);
        }
 #else /* RWL_ENABLE */
-       return IOCTL_ERROR;
+       return BCME_IOCTL_ERROR;
 #endif /* RWL_ENABLE */
 }
 
@@ -338,7 +371,7 @@ ioctl_setinformation_fe(void *wl, int cmd, void* buf, int *len)
 
        }
 #else /* RWL_ENABLE */
-       return IOCTL_ERROR;
+       return BCME_IOCTL_ERROR;
 #endif /* RWL_ENABLE */
 }
 
@@ -355,11 +388,11 @@ wl_get(void *wl, int cmd, void *buf, int len)
        } else {
                error = (int)ioctl_queryinformation_fe(wl, cmd, buf, &len);
        }
-       if (error == SERIAL_PORT_ERR)
-               return SERIAL_PORT_ERR;
+       if (error == BCME_SERIAL_PORT_ERR)
+               return BCME_SERIAL_PORT_ERR;
 
        if (error != 0)
-               return IOCTL_ERROR;
+               return BCME_IOCTL_ERROR;
 
        return error;
 }
@@ -379,11 +412,11 @@ wl_set(void *wl, int cmd, void *buf, int len)
                error = (int)ioctl_setinformation_fe(wl, cmd, buf, &len);
        }
 
-       if (error == SERIAL_PORT_ERR)
-               return SERIAL_PORT_ERR;
+       if (error == BCME_SERIAL_PORT_ERR)
+               return BCME_SERIAL_PORT_ERR;
 
        if (error != 0) {
-               return IOCTL_ERROR;
+               return BCME_IOCTL_ERROR;
        }
        return error;
 }
@@ -506,7 +539,7 @@ main(int argc, char **argv)
 #ifdef RWL_ENABLE
        if (*argv) {
                err = process_args(&ifr, argv);
-               if ((err == SERIAL_PORT_ERR) && (remote_type == REMOTE_DONGLE)) {
+               if ((err == BCME_SERIAL_PORT_ERR) && (remote_type == REMOTE_DONGLE)) {
                        DPRINT_ERR(ERR, "\n Retry again\n");
                        err = process_args((struct ifreq*)&ifr, argv);
                }
@@ -558,17 +591,24 @@ process_args(struct ifreq* ifr, char **argv)
                    break;
 
                if (remote_type == NO_REMOTE) {
-               /* use default interface */
+                       int ret;
+
+                       /* use default interface */
                        if (!ifr->ifr_name[0])
                                dhd_find(ifr, "dhd");
                        /* validate the interface */
-                       if (!ifr->ifr_name[0] || dhd_check((void *)ifr)) {
-                       if (strcmp("dldn", *argv) != 0) {
-                               fprintf(stderr, "%s: dhd driver adapter not found\n", av0);
-                               exit(BCME_ERROR);
+                       if (!ifr->ifr_name[0]) {
+                               if (strcmp("dldn", *argv) != 0) {
+                                       exit(ENXIO);
+                                       syserr("interface");
+                               }
+                       }
+                       if ((ret = dhd_check((void *)ifr)) != 0) {
+                               if (strcmp("dldn", *argv) != 0) {
+                                       errno = -ret;
+                                       syserr("dhd_check");
                                }
                        }
-
                }
                /* search for command */
                cmd = dhd_find_cmd(*argv);
@@ -593,9 +633,9 @@ process_args(struct ifreq* ifr, char **argv)
                }
        } else if (!cmd)
                dhd_usage(NULL);
-       else if (err == USAGE_ERROR)
+       else if (err == BCME_USAGE_ERROR)
                dhd_cmd_usage(cmd);
-       else if (err == IOCTL_ERROR)
+       else if (err == BCME_IOCTL_ERROR)
                dhd_printlasterror((void *) ifr);
 
        return err;
diff --git a/bcmdhd/dhdutil/dhdu_nl80211.c b/bcmdhd/dhdutil/dhdu_nl80211.c
new file mode 100644 (file)
index 0000000..8e681f8
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * nl80211 linux driver interface.
+ *
+ * Copyright (C) 1999-2013, Broadcom Corporation
+ * 
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $Id: $
+ */
+#include <errno.h>
+#include <linux/nl80211.h>
+#include <dhdioctl.h>
+#include "dhdu_nl80211.h"
+
+/* libnl 1.x compatibility code */
+#if !defined(CONFIG_LIBNL20) && !defined(CONFIG_LIBNL30)
+static inline struct nl_handle *nl_socket_alloc(void)
+{
+       return nl_handle_alloc();
+}
+
+static inline void nl_socket_free(struct nl_sock *h)
+{
+       nl_handle_destroy(h);
+}
+#endif /* CONFIG_LIBNL20 && CONFIG_LIBNL30 */
+
+static int dhd_nl_error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg)
+{
+       int *ret = arg;
+       *ret = err->error;
+       return NL_STOP;
+}
+
+static int dhd_nl_finish_handler(struct nl_msg *msg, void *arg)
+{
+       int *ret = arg;
+       *ret = 0;
+       return NL_SKIP;
+}
+
+static int dhd_nl_ack_handler(struct nl_msg *msg, void *arg)
+{
+       int *ret = arg;
+       *ret = 0;
+       return NL_STOP;
+}
+
+static int dhd_nl_valid_handler(struct nl_msg *msg, void *arg)
+{
+       return NL_SKIP;
+}
+
+int dhd_nl_sock_connect(struct dhd_netlink_info *dhd_nli)
+{
+       dhd_nli->nl = nl_socket_alloc();
+       if (dhd_nli->nl == NULL)
+               return -1;
+
+       if (genl_connect(dhd_nli->nl) < 0) {
+               fprintf(stderr, "netlink connection failed\n");
+               goto err;
+       }
+
+       dhd_nli->nl_id = genl_ctrl_resolve(dhd_nli->nl, "nl80211");
+       if (dhd_nli->nl_id < 0) {
+               fprintf(stderr, "'nl80211' netlink not found\n");
+               goto err;
+       }
+
+       dhd_nli->cb = nl_cb_alloc(NL_CB_DEBUG);
+       if (dhd_nli->cb == NULL)
+               goto err;
+
+       nl_socket_set_cb(dhd_nli->nl, dhd_nli->cb);
+       return 0;
+
+err:
+       nl_cb_put(dhd_nli->cb);
+       nl_socket_free(dhd_nli->nl);
+       fprintf(stderr, "nl80211 connection failed\n");
+       return -1;
+}
+
+void dhd_nl_sock_disconnect(struct dhd_netlink_info *dhd_nli)
+{
+       nl_cb_put(dhd_nli->cb);
+       nl_socket_free(dhd_nli->nl);
+}
+
+int dhd_nl_do_testmode(struct dhd_netlink_info *dhd_nli, dhd_ioctl_t *ioc)
+{
+       struct nl_msg *msg;
+       int err;
+
+       msg = nlmsg_alloc();
+       if (msg == NULL)
+               return -ENOMEM;
+
+       /* fill testmode message */
+       genlmsg_put(msg, 0, 0, dhd_nli->nl_id, 0, 0,
+               NL80211_CMD_TESTMODE, 0);
+       NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dhd_nli->ifidx);
+       NLA_PUT(msg, NL80211_ATTR_TESTDATA, sizeof(*ioc), ioc);
+
+       err = nl_send_auto_complete(dhd_nli->nl, msg);
+       if (err < 0)
+               goto out;
+
+       err = 1;
+       nl_cb_err(dhd_nli->cb, NL_CB_CUSTOM, dhd_nl_error_handler, &err);
+       nl_cb_set(dhd_nli->cb, NL_CB_ACK, NL_CB_CUSTOM,
+               dhd_nl_ack_handler, &err);
+       nl_cb_set(dhd_nli->cb, NL_CB_FINISH, NL_CB_CUSTOM,
+               dhd_nl_finish_handler, &err);
+       nl_cb_set(dhd_nli->cb, NL_CB_VALID, NL_CB_CUSTOM,
+               dhd_nl_valid_handler, &err);
+       while (err > 0)
+               nl_recvmsgs(dhd_nli->nl, dhd_nli->cb);
+out:
+       nlmsg_free(msg);
+       return err;
+
+nla_put_failure:
+       fprintf(stderr, "setting netlink attribute failed\n");
+       err = -EFAULT;
+       goto out;
+}
diff --git a/bcmdhd/dhdutil/dhdu_nl80211.h b/bcmdhd/dhdutil/dhdu_nl80211.h
new file mode 100644 (file)
index 0000000..49e13c6
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Definitions for DHD nl80211 driver interface.
+ *
+ *
+ * Copyright (C) 1999-2013, Broadcom Corporation
+ * 
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $Id: $
+ */
+
+#ifndef DHDU_NL80211_H_
+#define DHDU_NL80211_H_
+
+#ifdef NL80211
+
+#include <netlink/genl/genl.h>
+#include <netlink/genl/family.h>
+#include <netlink/genl/ctrl.h>
+
+/* libnl 1.x compatibility code */
+#if !defined(CONFIG_LIBNL20) && !defined(CONFIG_LIBNL30)
+#define nl_sock                nl_handle
+#endif
+
+struct dhd_netlink_info
+{
+       struct nl_sock *nl;
+       struct nl_cb *cb;
+       int nl_id;
+       int ifidx;
+};
+
+int dhd_nl_sock_connect(struct dhd_netlink_info *dhd_nli);
+void dhd_nl_sock_disconnect(struct dhd_netlink_info *dhd_nli);
+int dhd_nl_do_testmode(struct dhd_netlink_info *dhd_nli, dhd_ioctl_t *ioc);
+
+#endif /* NL80211 */
+
+#endif /* DHDU_NL80211_H_ */
index 88d41d6..7c10bbd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * BCM common config options
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  * 
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -15,9 +15,9 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: bcm_cfg.h 294399 2011-11-07 03:31:22Z $
+ * $Id: bcm_cfg.h 351867 2012-08-21 18:46:16Z $
  */
 
 #ifndef _bcm_cfg_h_
 #define _bcm_cfg_h_
-#endif 
+#endif /* _bcm_cfg_h_ */
index 9f4a332..450cbc1 100644 (file)
@@ -35,7 +35,7 @@
  *              and instrumentation on top of the heap, without modifying the heap
  *              allocation implementation.
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  * 
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
index 5d19dab..ab2c84f 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Definitions subject to change without notice.
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  *
  * $Id: bcmcdc.h 318308 2012-03-02 02:23:42Z $
  */
-
 #ifndef _bcmcdc_h_
 #define        _bcmcdc_h_
 #include <proto/ethernet.h>
 
 typedef struct cdc_ioctl {
-       uint32 cmd;
-       uint32 len;
-       uint32 flags;
-       uint32 status;
+       uint32 cmd;      /* ioctl command value */
+       uint32 len;      /* lower 16: output buflen; upper 16: input buflen (excludes header) */
+       uint32 flags;    /* flag defns given below */
+       uint32 status;   /* status code returned from the device */
 } cdc_ioctl_t;
 
-
+/* Max valid buffer size that can be sent to the dongle */
 #define CDC_MAX_MSG_SIZE   ETHER_MAX_LEN
 
-
-#define CDCL_IOC_OUTLEN_MASK   0x0000FFFF
+/* len field is divided into input and output buffer lengths */
+#define CDCL_IOC_OUTLEN_MASK   0x0000FFFF  /* maximum or expected response length, */
+                                          /* excluding IOCTL header */
 #define CDCL_IOC_OUTLEN_SHIFT  0
-#define CDCL_IOC_INLEN_MASK    0xFFFF0000
+#define CDCL_IOC_INLEN_MASK    0xFFFF0000   /* input buffer length, excluding IOCTL header */
 #define CDCL_IOC_INLEN_SHIFT   16
 
-
-#define CDCF_IOC_ERROR         0x01
-#define CDCF_IOC_SET           0x02
-#define CDCF_IOC_OVL_IDX_MASK  0x3c
-#define CDCF_IOC_OVL_RSV       0x40
-#define CDCF_IOC_OVL           0x80
-#define CDCF_IOC_ACTION_MASK   0xfe
-#define CDCF_IOC_ACTION_SHIFT  1
-#define CDCF_IOC_IF_MASK       0xF000
+/* CDC flag definitions */
+#define CDCF_IOC_ERROR         0x01    /* 0=success, 1=ioctl cmd failed */
+#define CDCF_IOC_SET           0x02    /* 0=get, 1=set cmd */
+#define CDCF_IOC_OVL_IDX_MASK  0x3c    /* overlay region index mask */
+#define CDCF_IOC_OVL_RSV       0x40    /* 1=reserve this overlay region */
+#define CDCF_IOC_OVL           0x80    /* 1=this ioctl corresponds to an overlay */
+#define CDCF_IOC_ACTION_MASK   0xfe    /* SET/GET, OVL_IDX, OVL_RSV, OVL mask */
+#define CDCF_IOC_ACTION_SHIFT  1       /* SET/GET, OVL_IDX, OVL_RSV, OVL shift */
+#define CDCF_IOC_IF_MASK       0xF000  /* I/F index */
 #define CDCF_IOC_IF_SHIFT      12
-#define CDCF_IOC_ID_MASK       0xFFFF0000
-#define CDCF_IOC_ID_SHIFT      16
+#define CDCF_IOC_ID_MASK       0xFFFF0000      /* used to uniquely id an ioctl req/resp pairing */
+#define CDCF_IOC_ID_SHIFT      16              /* # of bits of shift for ID Mask */
 
 #define CDC_IOC_IF_IDX(flags)  (((flags) & CDCF_IOC_IF_MASK) >> CDCF_IOC_IF_SHIFT)
 #define CDC_IOC_ID(flags)      (((flags) & CDCF_IOC_ID_MASK) >> CDCF_IOC_ID_SHIFT)
@@ -62,41 +62,47 @@ typedef struct cdc_ioctl {
 #define CDC_SET_IF_IDX(hdr, idx) \
        ((hdr)->flags = (((hdr)->flags & ~CDCF_IOC_IF_MASK) | ((idx) << CDCF_IOC_IF_SHIFT)))
 
-
+/*
+ * BDC header
+ *
+ *   The BDC header is used on data packets to convey priority across USB.
+ */
 
 struct bdc_header {
-       uint8   flags;                  
-       uint8   priority;               
+       uint8   flags;                  /* Flags */
+       uint8   priority;               /* 802.1d Priority 0:2 bits, 4:7 USB flow control info */
        uint8   flags2;
-       uint8   dataOffset;             
+       uint8   dataOffset;             /* Offset from end of BDC header to packet data, in
+                                        * 4-byte words.  Leaves room for optional headers.
+                                        */
 };
 
 #define        BDC_HEADER_LEN          4
 
+/* flags field bitmap */
+#define BDC_FLAG_80211_PKT     0x01    /* Packet is in 802.11 format (dongle -> host) */
+#define BDC_FLAG_SUM_GOOD      0x04    /* Dongle has verified good RX checksums */
+#define BDC_FLAG_SUM_NEEDED    0x08    /* Dongle needs to do TX checksums: host->device */
+#define BDC_FLAG_EVENT_MSG     0x08    /* Payload contains an event msg: device->host */
+#define BDC_FLAG_VER_MASK      0xf0    /* Protocol version mask */
+#define BDC_FLAG_VER_SHIFT     4       /* Protocol version shift */
 
-#define BDC_FLAG_80211_PKT     0x01    
-#define BDC_FLAG_SUM_GOOD      0x04    
-#define BDC_FLAG_SUM_NEEDED    0x08    
-#define BDC_FLAG_EVENT_MSG     0x08    
-#define BDC_FLAG_VER_MASK      0xf0    
-#define BDC_FLAG_VER_SHIFT     4       
-
-
+/* priority field bitmap */
 #define BDC_PRIORITY_MASK      0x07
-#define BDC_PRIORITY_FC_MASK   0xf0    
-#define BDC_PRIORITY_FC_SHIFT  4       
+#define BDC_PRIORITY_FC_MASK   0xf0    /* flow control info mask */
+#define BDC_PRIORITY_FC_SHIFT  4       /* flow control info shift */
 
-
-#define BDC_FLAG2_IF_MASK      0x0f    
+/* flags2 field bitmap */
+#define BDC_FLAG2_IF_MASK      0x0f    /* interface index (host <-> dongle) */
 #define BDC_FLAG2_IF_SHIFT     0
-#define BDC_FLAG2_FC_FLAG      0x10    
-                                       
-
-
-#define BDC_PROTO_VER_1                1       
-#define BDC_PROTO_VER          2       
+#define BDC_FLAG2_FC_FLAG      0x10    /* flag to indicate if pkt contains */
+                                       /* FLOW CONTROL info only */
 
+/* version numbers */
+#define BDC_PROTO_VER_1                1       /* Old Protocol version */
+#define BDC_PROTO_VER          2       /* Protocol version */
 
+/* flags2.if field access macros */
 #define BDC_GET_IF_IDX(hdr) \
        ((int)((((hdr)->flags2) & BDC_FLAG2_IF_MASK) >> BDC_FLAG2_IF_SHIFT))
 #define BDC_SET_IF_IDX(hdr, idx) \
@@ -117,4 +123,4 @@ struct bdc_header {
        ((hdr)->flags = (((hdr)->flags & ~BDC_FLAG_PAD_MASK) | \
        (((idx) & BDC_FLAG_PAD_IDX) << BDC_FLAG_PAD_SHIFT)))
 
-#endif
+#endif /* _bcmcdc_h_ */
index 44634a1..5cb5df3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Misc system wide definitions
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: bcmdefs.h 316830 2012-02-23 20:29:22Z $
+ * $Id: bcmdefs.h 381895 2013-01-30 07:06:40Z $
  */
 
 #ifndef        _bcmdefs_h_
 #define        _bcmdefs_h_
 
+/*
+ * One doesn't need to include this file explicitly, gets included automatically if
+ * typedefs.h is included.
+ */
 
-
-
+/* Use BCM_REFERENCE to suppress warnings about intentionally-unused function
+ * arguments or local variables.
+ */
 #define BCM_REFERENCE(data)    ((void)(data))
 
-
+/* Compile-time assert can be used in place of ASSERT if the expression evaluates
+ * to a constant at compile time.
+ */
 #define STATIC_ASSERT(expr) { \
-        \
+       /* Make sure the expression is constant. */ \
        typedef enum { _STATIC_ASSERT_NOT_CONSTANT = (expr) } _static_assert_e; \
-        \
+       /* Make sure the expression is true. */ \
        typedef char STATIC_ASSERT_FAIL[(expr) ? 1 : -1]; \
 }
 
+/* Reclaiming text and data :
+ * The following macros specify special linker sections that can be reclaimed
+ * after a system is considered 'up'.
+ * BCMATTACHFN is also used for detach functions (it's not worth having a BCMDETACHFN,
+ * as in most cases, the attach function calls the detach function to clean up on error).
+ */
 
 #define bcmreclaimed           0
 #define _data  _data
 #define        BCMNMIATTACHFN(_fn)     _fn
 #define        BCMNMIATTACHDATA(_data) _data
 #define CONST  const
+#if defined(__ARM_ARCH_7A__)
+#define BCM47XX_CA9
+#else
+#undef BCM47XX_CA9
+#endif
 #ifndef BCMFASTPATH
+#if defined(BCM47XX_CA9)
+#define BCMFASTPATH            __attribute__ ((__section__ (".text.fastpath")))
+#define BCMFASTPATH_HOST       __attribute__ ((__section__ (".text.fastpath_host")))
+#else
 #define BCMFASTPATH
 #define BCMFASTPATH_HOST
-#endif 
-
+#endif
+#endif /* BCMFASTPATH */
 
 
+/* Put some library data/code into ROM to reduce RAM requirements */
 #define _data  _data
 #define BCMROMDAT_NAME(_data)  _data
 #define _fn            _fn
 #define BCMROMDAT_APATCH(data)
 #define BCMROMDAT_SPATCH(data)
 
-
-#define        SI_BUS                  0
-#define        PCI_BUS                 1
-#define        PCMCIA_BUS              2
-#define SDIO_BUS               3
-#define JTAG_BUS               4
-#define USB_BUS                        5
-#define SPI_BUS                        6
-#define RPC_BUS                        7
-
-
+/* Bus types */
+#define        SI_BUS                  0       /* SOC Interconnect */
+#define        PCI_BUS                 1       /* PCI target */
+#define        PCMCIA_BUS              2       /* PCMCIA target */
+#define SDIO_BUS               3       /* SDIO target */
+#define JTAG_BUS               4       /* JTAG */
+#define USB_BUS                        5       /* USB (does not support R/W REG) */
+#define SPI_BUS                        6       /* gSPI target */
+#define RPC_BUS                        7       /* RPC target */
+
+/* Allows size optimization for single-bus image */
 #ifdef BCMBUSTYPE
 #define BUSTYPE(bus)   (BCMBUSTYPE)
 #else
 #define BUSTYPE(bus)   (bus)
 #endif
 
-
+/* Allows size optimization for single-backplane image */
 #ifdef BCMCHIPTYPE
 #define CHIPTYPE(bus)  (BCMCHIPTYPE)
 #else
 #endif
 
 
-
+/* Allows size optimization for SPROM support */
 #if defined(BCMSPROMBUS)
 #define SPROMBUS       (BCMSPROMBUS)
 #elif defined(SI_PCMCIA_SROM)
 #define SPROMBUS       (PCI_BUS)
 #endif
 
-
+/* Allows size optimization for single-chip image */
 #ifdef BCMCHIPID
 #define CHIPID(chip)   (BCMCHIPID)
 #else
 #define CHIPREV(rev)   (rev)
 #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 DMADDR_MASK_32 0x0
-#define DMADDR_MASK_30 0xc0000000
-#define DMADDR_MASK_0  0xffffffff
-
-#define        DMADDRWIDTH_30  30
-#define        DMADDRWIDTH_32  32
-#define        DMADDRWIDTH_63  63
-#define        DMADDRWIDTH_64  64
+#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 */
 
 #ifdef BCMDMA64OSL
 typedef struct {
@@ -147,9 +170,9 @@ typedef unsigned long dmaaddr_t;
        do { \
                (_pa) = (_val);                 \
        } while (0)
-#endif
-
+#endif /* BCMDMA64OSL */
 
+/* One physical DMA segment */
 typedef struct  {
        dmaaddr_t addr;
        uint32    length;
@@ -159,28 +182,42 @@ typedef struct  {
 
 
 typedef struct {
-       void *oshdmah;
-       uint origsize;
+       void *oshdmah; /* Opaque handle for OSL to store its information */
+       uint origsize; /* Size of the virtual packet */
        uint nsegs;
        hnddma_seg_t segs[MAX_DMA_SEGS];
 } hnddma_seg_map_t;
 
 
-
+/* packet headroom necessary to accommodate 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).
+ */
 
 #if defined(BCM_RPC_NOCOPY) || defined(BCM_RCP_TXNOCOPY)
-
-#define BCMEXTRAHDROOM 220
+/* add 40 bytes to allow for extra RPC header and info  */
+#define BCMEXTRAHDROOM 260
+#else /* BCM_RPC_NOCOPY || BCM_RPC_TXNOCOPY */
+#if defined(BCM47XX_CA9)
+#define BCMEXTRAHDROOM 224
 #else
-#define BCMEXTRAHDROOM 172
-#endif
-
+#define BCMEXTRAHDROOM 204
+#endif /* linux && BCM47XX_CA9 */
+#endif /* BCM_RPC_NOCOPY || BCM_RPC_TXNOCOPY */
 
+/* Packet alignment for most efficient SDIO (can change based on platform) */
 #ifndef SDALIGN
 #define SDALIGN        32
 #endif
 
-
+/* 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 12
 #define BCMDONGLEPADSZ 16
 
@@ -194,9 +231,18 @@ typedef struct {
 
 #if defined(BCMASSERT_LOG)
 #define BCMASSERT_SUPPORT
-#endif
-
+#endif 
 
+/* Macros for doing definition and get/set of bitfields
+ * Usage example, e.g. a three-bit field (bits 4-6):
+ *    #define <NAME>_M BITFIELD_MASK(3)
+ *    #define <NAME>_S 4
+ * ...
+ *    regval = R_REG(osh, &regs->regfoo);
+ *    field = GFIELD(regval, <NAME>);
+ *    regval = SFIELD(regval, <NAME>, 1);
+ *    W_REG(osh, &regs->regfoo, regval);
+ */
 #define BITFIELD_MASK(width) \
                (((unsigned)1 << (width)) - 1)
 #define GFIELD(val, field) \
@@ -205,27 +251,28 @@ typedef struct {
                (((val) & (~(field ## _M << field ## _S))) | \
                 ((unsigned)(bits) << field ## _S))
 
-
+/* define BCMSMALL to remove misc features for memory-constrained environments */
 #ifdef BCMSMALL
 #undef BCMSPACE
-#define bcmspace       FALSE
+#define bcmspace       FALSE   /* if (bcmspace) code is discarded */
 #else
 #define        BCMSPACE
-#define bcmspace       TRUE
+#define bcmspace       TRUE    /* if (bcmspace) code is retained */
 #endif
 
-
+/* Max. nvram variable table size */
 #define        MAXSZ_NVRAM_VARS        4096
 
 
+/* Max size for reclaimable NVRAM array */
 #ifdef DL_NVRAM
 #define NVRAM_ARRAY_MAXSIZE    DL_NVRAM
 #else
 #define NVRAM_ARRAY_MAXSIZE    MAXSZ_NVRAM_VARS
-#endif 
+#endif /* DL_NVRAM */
 
 #ifdef BCMUSBDEV_ENABLED
 extern uint32 gFWID;
 #endif
 
-#endif 
+#endif /* _bcmdefs_h_ */
index 27b25a4..2526d12 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Broadcom device-specific manifest constants.
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
- *
+ * Copyright (C) 1999-2013, Broadcom Corporation
+ * 
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * copyright notice and this permission notice appear in all copies.
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: bcmdevs.h 329854 2012-04-27 01:42:28Z $
+ * $Id: bcmdevs.h 387183 2013-02-24 07:42:07Z $
  */
 
-
 #ifndef        _BCMDEVS_H
 #define        _BCMDEVS_H
 
-
+/* PCI vendor IDs */
 #define        VENDOR_EPIGRAM          0xfeda
 #define        VENDOR_BROADCOM         0x14e4
 #define        VENDOR_3COM             0x10b7
 #define        VENDOR_HP               0x103c
 #define        VENDOR_HP_COMPAQ        0x0e11
 #define        VENDOR_APPLE            0x106b
-#define VENDOR_SI_IMAGE                0x1095          
-#define VENDOR_BUFFALO         0x1154          
-#define VENDOR_TI              0x104c          
-#define VENDOR_RICOH           0x1180          
+#define VENDOR_SI_IMAGE                0x1095          /* Silicon Image, used by Arasan SDIO Host */
+#define VENDOR_BUFFALO         0x1154          /* Buffalo vendor id */
+#define VENDOR_TI              0x104c          /* Texas Instruments */
+#define VENDOR_RICOH           0x1180          /* Ricoh */
 #define VENDOR_JMICRON         0x197b
 
 
-
+/* PCMCIA vendor IDs */
 #define        VENDOR_BROADCOM_PCMCIA  0x02d0
 
-
+/* SDIO vendor IDs */
 #define        VENDOR_BROADCOM_SDIO    0x00BF
 
-
+/* DONGLE VID/PIDs */
 #define BCM_DNGL_VID           0x0a5c
 #define BCM_DNGL_BL_PID_4328   0xbd12
 #define BCM_DNGL_BL_PID_4322   0xbd13
 #define BCM_DNGL_BL_PID_43239   0xbd1b
 #define BCM_DNGL_BL_PID_4324   0xbd1c
 #define BCM_DNGL_BL_PID_4360   0xbd1d
+#define BCM_DNGL_BL_PID_43143  0xbd1e
+#define BCM_DNGL_BL_PID_43242  0xbd1f
+#define BCM_DNGL_BL_PID_43342  0xbd21
+#define BCM_DNGL_BL_PID_4335   0xbd20
+#define BCM_DNGL_BL_PID_4350   0xbd23
+#define BCM_DNGL_BL_PID_43341  0xbd22
 
 #define BCM_DNGL_BDC_PID       0x0bdc
 #define BCM_DNGL_JTAG_PID      0x4a44
 
+/* HW USB BLOCK [CPULESS USB] PIDs */
 #define BCM_HWUSB_PID_43239     43239
 
-
-#define        BCM4210_DEVICE_ID       0x1072          
-#define        BCM4230_DEVICE_ID       0x1086          
-#define        BCM4401_ENET_ID         0x170c          
-#define        BCM3352_DEVICE_ID       0x3352          
-#define        BCM3360_DEVICE_ID       0x3360          
+/* PCI Device IDs */
+#define        BCM4210_DEVICE_ID       0x1072          /* never used */
+#define        BCM4230_DEVICE_ID       0x1086          /* never used */
+#define        BCM4401_ENET_ID         0x170c          /* 4401b0 production enet cards */
+#define        BCM3352_DEVICE_ID       0x3352          /* bcm3352 device id */
+#define        BCM3360_DEVICE_ID       0x3360          /* bcm3360 device id */
 #define        BCM4211_DEVICE_ID       0x4211
 #define        BCM4231_DEVICE_ID       0x4231
-#define        BCM4303_D11B_ID         0x4303          
-#define        BCM4311_D11G_ID         0x4311          
-#define        BCM4311_D11DUAL_ID      0x4312          
-#define        BCM4311_D11A_ID         0x4313          
-#define        BCM4328_D11DUAL_ID      0x4314          
-#define        BCM4328_D11G_ID         0x4315          
-#define        BCM4328_D11A_ID         0x4316          
-#define        BCM4318_D11G_ID         0x4318          
-#define        BCM4318_D11DUAL_ID      0x4319          
-#define        BCM4318_D11A_ID         0x431a          
-#define        BCM4325_D11DUAL_ID      0x431b          
-#define        BCM4325_D11G_ID         0x431c          
-#define        BCM4325_D11A_ID         0x431d          
-#define        BCM4306_D11G_ID         0x4320          
-#define        BCM4306_D11A_ID         0x4321          
-#define        BCM4306_UART_ID         0x4322          
-#define        BCM4306_V90_ID          0x4323          
-#define        BCM4306_D11DUAL_ID      0x4324          
-#define        BCM4306_D11G_ID2        0x4325          
-#define        BCM4321_D11N_ID         0x4328
-#define        BCM4321_D11N2G_ID       0x4329
-#define        BCM4321_D11N5G_ID       0x432a
-#define BCM4322_D11N_ID                0x432b
-#define BCM4322_D11N2G_ID      0x432c
-#define BCM4322_D11N5G_ID      0x432d
-#define BCM4329_D11N_ID                0x432e
-#define BCM4329_D11N2G_ID      0x432f
-#define BCM4329_D11N5G_ID      0x4330
-#define        BCM4315_D11DUAL_ID      0x4334
-#define        BCM4315_D11G_ID         0x4335
-#define        BCM4315_D11A_ID         0x4336
-#define BCM4319_D11N_ID                0x4337
-#define BCM4319_D11N2G_ID      0x4338
-#define BCM4319_D11N5G_ID      0x4339
-#define BCM43231_D11N2G_ID     0x4340
-#define BCM43221_D11N2G_ID     0x4341
-#define BCM43222_D11N_ID       0x4350
-#define BCM43222_D11N2G_ID     0x4351
-#define BCM43222_D11N5G_ID     0x4352
-#define BCM43224_D11N_ID       0x4353
-#define BCM43224_D11N_ID_VEN1  0x0576
-#define BCM43226_D11N_ID       0x4354
-#define BCM43236_D11N_ID       0x4346
-#define BCM43236_D11N2G_ID     0x4347
-#define BCM43236_D11N5G_ID     0x4348
-#define BCM43225_D11N2G_ID     0x4357
-#define BCM43421_D11N_ID       0xA99D
-#define BCM4313_D11N2G_ID      0x4727
-#define BCM4330_D11N_ID         0x4360
-#define BCM4330_D11N2G_ID       0x4361
-#define BCM4330_D11N5G_ID       0x4362
-#define BCM4336_D11N_ID                0x4343
-#define BCM6362_D11N_ID                0x435f
-#define BCM4331_D11N_ID                0x4331
-#define BCM4331_D11N2G_ID      0x4332
-#define BCM4331_D11N5G_ID      0x4333
-#define BCM43237_D11N_ID       0x4355
-#define BCM43237_D11N5G_ID     0x4356
-#define BCM43227_D11N2G_ID     0x4358
-#define BCM43228_D11N_ID               0x4359
-#define BCM43228_D11N5G_ID     0x435a
-#define BCM43362_D11N_ID       0x4363
-#define BCM43239_D11N_ID       0x4370
-#define BCM4324_D11N_ID                0x4374          
-#define BCM43217_D11N2G_ID     0x43a9          
-#define BCM43131_D11N2G_ID     0x43aa          
-#define BCM4314_D11N2G_ID      0x4364          
-#define BCM43142_D11N2G_ID     0x4365          
-#define BCM4334_D11N_ID                0x4380          
-#define BCM4334_D11N2G_ID      0x4381          
-#define BCM4334_D11N5G_ID      0x4382          
-#define BCM43341_D11N_ID       0x4386          
-#define BCM43341_D11N2G_ID     0x4387          
-#define BCM43341_D11N5G_ID     0x4388          
+#define        BCM4303_D11B_ID         0x4303          /* 4303 802.11b */
+#define        BCM4311_D11G_ID         0x4311          /* 4311 802.11b/g id */
+#define        BCM4311_D11DUAL_ID      0x4312          /* 4311 802.11a/b/g id */
+#define        BCM4311_D11A_ID         0x4313          /* 4311 802.11a id */
+#define        BCM4328_D11DUAL_ID      0x4314          /* 4328/4312 802.11a/g id */
+#define        BCM4328_D11G_ID         0x4315          /* 4328/4312 802.11g id */
+#define        BCM4328_D11A_ID         0x4316          /* 4328/4312 802.11a id */
+#define        BCM4318_D11G_ID         0x4318          /* 4318 802.11b/g id */
+#define        BCM4318_D11DUAL_ID      0x4319          /* 4318 802.11a/b/g id */
+#define        BCM4318_D11A_ID         0x431a          /* 4318 802.11a id */
+#define        BCM4325_D11DUAL_ID      0x431b          /* 4325 802.11a/g id */
+#define        BCM4325_D11G_ID         0x431c          /* 4325 802.11g id */
+#define        BCM4325_D11A_ID         0x431d          /* 4325 802.11a id */
+#define        BCM4306_D11G_ID         0x4320          /* 4306 802.11g */
+#define        BCM4306_D11A_ID         0x4321          /* 4306 802.11a */
+#define        BCM4306_UART_ID         0x4322          /* 4306 uart */
+#define        BCM4306_V90_ID          0x4323          /* 4306 v90 codec */
+#define        BCM4306_D11DUAL_ID      0x4324          /* 4306 dual A+B */
+#define        BCM4306_D11G_ID2        0x4325          /* BCM4306_D11G_ID; INF w/loose binding war */
+#define        BCM4321_D11N_ID         0x4328          /* 4321 802.11n dualband id */
+#define        BCM4321_D11N2G_ID       0x4329          /* 4321 802.11n 2.4Ghz band id */
+#define        BCM4321_D11N5G_ID       0x432a          /* 4321 802.11n 5Ghz band id */
+#define BCM4322_D11N_ID                0x432b          /* 4322 802.11n dualband device */
+#define BCM4322_D11N2G_ID      0x432c          /* 4322 802.11n 2.4GHz device */
+#define BCM4322_D11N5G_ID      0x432d          /* 4322 802.11n 5GHz device */
+#define BCM4329_D11N_ID                0x432e          /* 4329 802.11n dualband device */
+#define BCM4329_D11N2G_ID      0x432f          /* 4329 802.11n 2.4G device */
+#define BCM4329_D11N5G_ID      0x4330          /* 4329 802.11n 5G device */
+#define        BCM4315_D11DUAL_ID      0x4334          /* 4315 802.11a/g id */
+#define        BCM4315_D11G_ID         0x4335          /* 4315 802.11g id */
+#define        BCM4315_D11A_ID         0x4336          /* 4315 802.11a id */
+#define BCM4319_D11N_ID                0x4337          /* 4319 802.11n dualband device */
+#define BCM4319_D11N2G_ID      0x4338          /* 4319 802.11n 2.4G device */
+#define BCM4319_D11N5G_ID      0x4339          /* 4319 802.11n 5G device */
+#define BCM43231_D11N2G_ID     0x4340          /* 43231 802.11n 2.4GHz device */
+#define BCM43221_D11N2G_ID     0x4341          /* 43221 802.11n 2.4GHz device */
+#define BCM43222_D11N_ID       0x4350          /* 43222 802.11n dualband device */
+#define BCM43222_D11N2G_ID     0x4351          /* 43222 802.11n 2.4GHz device */
+#define BCM43222_D11N5G_ID     0x4352          /* 43222 802.11n 5GHz device */
+#define BCM43224_D11N_ID       0x4353          /* 43224 802.11n dualband device */
+#define BCM43224_D11N_ID_VEN1  0x0576          /* Vendor specific 43224 802.11n db device */
+#define BCM43226_D11N_ID       0x4354          /* 43226 802.11n dualband device */
+#define BCM43236_D11N_ID       0x4346          /* 43236 802.11n dualband device */
+#define BCM43236_D11N2G_ID     0x4347          /* 43236 802.11n 2.4GHz device */
+#define BCM43236_D11N5G_ID     0x4348          /* 43236 802.11n 5GHz device */
+#define BCM43225_D11N2G_ID     0x4357          /* 43225 802.11n 2.4GHz device */
+#define BCM43421_D11N_ID       0xA99D          /* 43421 802.11n dualband device */
+#define BCM4313_D11N2G_ID      0x4727          /* 4313 802.11n 2.4G device */
+#define BCM4330_D11N_ID         0x4360          /* 4330 802.11n dualband device */
+#define BCM4330_D11N2G_ID       0x4361          /* 4330 802.11n 2.4G device */
+#define BCM4330_D11N5G_ID       0x4362          /* 4330 802.11n 5G device */
+#define BCM4336_D11N_ID                0x4343          /* 4336 802.11n 2.4GHz device */
+#define BCM6362_D11N_ID                0x435f          /* 6362 802.11n dualband device */
+#define BCM6362_D11N2G_ID      0x433f          /* 6362 802.11n 2.4Ghz band id */
+#define BCM6362_D11N5G_ID      0x434f          /* 6362 802.11n 5Ghz band id */
+#define BCM4331_D11N_ID                0x4331          /* 4331 802.11n dualband id */
+#define BCM4331_D11N2G_ID      0x4332          /* 4331 802.11n 2.4Ghz band id */
+#define BCM4331_D11N5G_ID      0x4333          /* 4331 802.11n 5Ghz band id */
+#define BCM43237_D11N_ID       0x4355          /* 43237 802.11n dualband device */
+#define BCM43237_D11N5G_ID     0x4356          /* 43237 802.11n 5GHz device */
+#define BCM43227_D11N2G_ID     0x4358          /* 43228 802.11n 2.4GHz device */
+#define BCM43228_D11N_ID       0x4359          /* 43228 802.11n DualBand device */
+#define BCM43228_D11N5G_ID     0x435a          /* 43228 802.11n 5GHz device */
+#define BCM43362_D11N_ID       0x4363          /* 43362 802.11n 2.4GHz device */
+#define BCM43239_D11N_ID       0x4370          /* 43239 802.11n dualband device */
+#define BCM4324_D11N_ID                0x4374          /* 4324 802.11n dualband device */
+#define BCM43217_D11N2G_ID     0x43a9          /* 43217 802.11n 2.4GHz device */
+#define BCM43131_D11N2G_ID     0x43aa          /* 43131 802.11n 2.4GHz device */
+#define BCM4314_D11N2G_ID      0x4364          /* 4314 802.11n 2.4G device */
+#define BCM43142_D11N2G_ID     0x4365          /* 43142 802.11n 2.4G device */
+#define BCM43143_D11N2G_ID     0x4366          /* 43143 802.11n 2.4G device */
+#define BCM4334_D11N_ID                0x4380          /* 4334 802.11n dualband device */
+#define BCM4334_D11N2G_ID      0x4381          /* 4334 802.11n 2.4G device */
+#define BCM4334_D11N5G_ID      0x4382          /* 4334 802.11n 5G device */
+#define BCM43342_D11N_ID       0x4383          /* 43342 802.11n dualband device */
+#define BCM43342_D11N2G_ID     0x4384          /* 43342 802.11n 2.4G device */
+#define BCM43342_D11N5G_ID     0x4385          /* 43342 802.11n 5G device */
+#define BCM43341_D11N_ID       0x4386          /* 43341 802.11n dualband device */
+#define BCM43341_D11N2G_ID     0x4387          /* 43341 802.11n 2.4G device */
+#define BCM43341_D11N5G_ID     0x4388          /* 43341 802.11n 5G device */
 #define BCM4360_D11AC_ID       0x43a0
 #define BCM4360_D11AC2G_ID     0x43a1
 #define BCM4360_D11AC5G_ID     0x43a2
+#define BCM4335_D11AC_ID       0x43ae
+#define BCM4335_D11AC2G_ID     0x43af
+#define BCM4335_D11AC5G_ID     0x43b0
+#define BCM4352_D11AC_ID       0x43b1          /* 4352 802.11ac dualband device */
+#define BCM4352_D11AC2G_ID     0x43b2          /* 4352 802.11ac 2.4G device */
+#define BCM4352_D11AC5G_ID     0x43b3          /* 4352 802.11ac 5G device */
 
-
+/* PCI Subsystem ID */
 #define BCM943228HMB_SSID_VEN1 0x0607
 #define BCM94313HMGBL_SSID_VEN1        0x0608
 #define BCM94313HMG_SSID_VEN1  0x0609
-
-
-#define BCM4335_D11AC_ID       0x43ae
-#define BCM4335_D11AC2G_ID     0x43af
-#define BCM4335_D11AC5G_ID     0x43b0
-#define BCM4352_D11AC_ID       0x43b1          
-#define BCM4352_D11AC2G_ID     0x43b2          
-#define BCM4352_D11AC5G_ID     0x43b3          
-
-#define        BCMGPRS_UART_ID         0x4333          
-#define        BCMGPRS2_UART_ID        0x4344          
-#define FPGA_JTAGM_ID          0x43f0          
-#define BCM_JTAGM_ID           0x43f1          
-#define SDIOH_FPGA_ID          0x43f2          
-#define BCM_SDIOH_ID           0x43f3          
-#define SDIOD_FPGA_ID          0x43f4          
-#define SPIH_FPGA_ID           0x43f5          
-#define BCM_SPIH_ID            0x43f6          
-#define MIMO_FPGA_ID           0x43f8          
-#define BCM_JTAGM2_ID          0x43f9          
-#define SDHCI_FPGA_ID          0x43fa          
-#define        BCM4402_ENET_ID         0x4402          
-#define        BCM4402_V90_ID          0x4403          
-#define        BCM4410_DEVICE_ID       0x4410          
-#define        BCM4412_DEVICE_ID       0x4412          
-#define        BCM4430_DEVICE_ID       0x4430          
-#define        BCM4432_DEVICE_ID       0x4432          
-#define        BCM4704_ENET_ID         0x4706          
-#define        BCM4710_DEVICE_ID       0x4710          
-#define        BCM47XX_AUDIO_ID        0x4711          
-#define        BCM47XX_V90_ID          0x4712          
-#define        BCM47XX_ENET_ID         0x4713          
-#define        BCM47XX_EXT_ID          0x4714          
-#define        BCM47XX_GMAC_ID         0x4715          
-#define        BCM47XX_USBH_ID         0x4716          
-#define        BCM47XX_USBD_ID         0x4717          
-#define        BCM47XX_IPSEC_ID        0x4718          
-#define        BCM47XX_ROBO_ID         0x4719          
-#define        BCM47XX_USB20H_ID       0x471a          
-#define        BCM47XX_USB20D_ID       0x471b          
-#define        BCM47XX_ATA100_ID       0x471d          
-#define        BCM47XX_SATAXOR_ID      0x471e          
-#define        BCM47XX_GIGETH_ID       0x471f          
-#define        BCM4712_MIPS_ID         0x4720          
-#define        BCM4716_DEVICE_ID       0x4722          
-#define BCM47XX_SMBUS_EMU_ID   0x47fe          
-#define        BCM47XX_XOR_EMU_ID      0x47ff          
-#define        EPI41210_DEVICE_ID      0xa0fa          
-#define        EPI41230_DEVICE_ID      0xa10e          
-#define JINVANI_SDIOH_ID       0x4743          
-#define BCM27XX_SDIOH_ID       0x2702          
-#define PCIXX21_FLASHMEDIA_ID  0x803b          
-#define PCIXX21_SDIOH_ID       0x803c          
-#define R5C822_SDIOH_ID                0x0822          
-#define JMICRON_SDIOH_ID       0x2381          
-
-
-#define        BCM4306_CHIP_ID         0x4306          
-#define        BCM4311_CHIP_ID         0x4311          
-#define        BCM43111_CHIP_ID        43111           
-#define        BCM43112_CHIP_ID        43112           
-#define        BCM4312_CHIP_ID         0x4312          
-#define BCM4313_CHIP_ID                0x4313          
-#define        BCM43131_CHIP_ID        43131           
-#define        BCM4315_CHIP_ID         0x4315          
-#define        BCM4318_CHIP_ID         0x4318          
-#define        BCM4319_CHIP_ID         0x4319          
-#define        BCM4320_CHIP_ID         0x4320          
-#define        BCM4321_CHIP_ID         0x4321          
-#define        BCM43217_CHIP_ID        43217           
-#define        BCM4322_CHIP_ID         0x4322          
-#define        BCM43221_CHIP_ID        43221           
-#define        BCM43222_CHIP_ID        43222           
-#define        BCM43224_CHIP_ID        43224           
-#define        BCM43225_CHIP_ID        43225           
-#define        BCM43227_CHIP_ID        43227           
-#define        BCM43228_CHIP_ID        43228           
-#define        BCM43226_CHIP_ID        43226           
-#define        BCM43231_CHIP_ID        43231           
-#define        BCM43234_CHIP_ID        43234           
-#define        BCM43235_CHIP_ID        43235           
-#define        BCM43236_CHIP_ID        43236           
-#define        BCM43237_CHIP_ID        43237           
-#define        BCM43238_CHIP_ID        43238           
-#define        BCM43239_CHIP_ID        43239           
-#define        BCM43420_CHIP_ID        43420           
-#define        BCM43421_CHIP_ID        43421           
-#define        BCM43428_CHIP_ID        43428           
-#define        BCM43431_CHIP_ID        43431           
-#define        BCM43460_CHIP_ID        43460           
-#define        BCM4325_CHIP_ID         0x4325          
-#define        BCM4328_CHIP_ID         0x4328          
-#define        BCM4329_CHIP_ID         0x4329          
-#define        BCM4331_CHIP_ID         0x4331          
-#define BCM4336_CHIP_ID                0x4336          
-#define BCM43362_CHIP_ID       43362           
-#define BCM4330_CHIP_ID                0x4330          
-#define BCM6362_CHIP_ID                0x6362          
-#define BCM4314_CHIP_ID                0x4314          
-#define BCM43142_CHIP_ID       43142           
-#define        BCM4324_CHIP_ID         0x4324          
-#define        BCM43242_CHIP_ID        43242           
-#define BCM4334_CHIP_ID                0x4334          
-#define BCM4360_CHIP_ID                0x4360          
-#define BCM4352_CHIP_ID                0x4352          
+#define BCM943142HM_SSID_VEN1  0x0611
+
+#define BCM43143_D11N2G_ID     0x4366          /* 43143 802.11n 2.4G device */
+
+#define BCM43242_D11N_ID       0x4367          /* 43242 802.11n dualband device */
+#define BCM43242_D11N2G_ID     0x4368          /* 43242 802.11n 2.4G device */
+#define BCM43242_D11N5G_ID     0x4369          /* 43242 802.11n 5G device */
+
+#define BCM4350_D11AC_ID       0x43a3
+#define BCM4350_D11AC2G_ID     0x43a4
+#define BCM4350_D11AC5G_ID     0x43a5
+
+
+#define        BCMGPRS_UART_ID         0x4333          /* Uart id used by 4306/gprs card */
+#define        BCMGPRS2_UART_ID        0x4344          /* Uart id used by 4306/gprs card */
+#define FPGA_JTAGM_ID          0x43f0          /* FPGA jtagm device id */
+#define BCM_JTAGM_ID           0x43f1          /* BCM jtagm device id */
+#define SDIOH_FPGA_ID          0x43f2          /* sdio host fpga */
+#define BCM_SDIOH_ID           0x43f3          /* BCM sdio host id */
+#define SDIOD_FPGA_ID          0x43f4          /* sdio device fpga */
+#define SPIH_FPGA_ID           0x43f5          /* PCI SPI Host Controller FPGA */
+#define BCM_SPIH_ID            0x43f6          /* Synopsis SPI Host Controller */
+#define MIMO_FPGA_ID           0x43f8          /* FPGA mimo minimacphy device id */
+#define BCM_JTAGM2_ID          0x43f9          /* BCM alternate jtagm device id */
+#define SDHCI_FPGA_ID          0x43fa          /* Standard SDIO Host Controller FPGA */
+#define        BCM4402_ENET_ID         0x4402          /* 4402 enet */
+#define        BCM4402_V90_ID          0x4403          /* 4402 v90 codec */
+#define        BCM4410_DEVICE_ID       0x4410          /* bcm44xx family pci iline */
+#define        BCM4412_DEVICE_ID       0x4412          /* bcm44xx family pci enet */
+#define        BCM4430_DEVICE_ID       0x4430          /* bcm44xx family cardbus iline */
+#define        BCM4432_DEVICE_ID       0x4432          /* bcm44xx family cardbus enet */
+#define        BCM4704_ENET_ID         0x4706          /* 4704 enet (Use 47XX_ENET_ID instead!) */
+#define        BCM4710_DEVICE_ID       0x4710          /* 4710 primary function 0 */
+#define        BCM47XX_AUDIO_ID        0x4711          /* 47xx audio codec */
+#define        BCM47XX_V90_ID          0x4712          /* 47xx v90 codec */
+#define        BCM47XX_ENET_ID         0x4713          /* 47xx enet */
+#define        BCM47XX_EXT_ID          0x4714          /* 47xx external i/f */
+#define        BCM47XX_GMAC_ID         0x4715          /* 47xx Unimac based GbE */
+#define        BCM47XX_USBH_ID         0x4716          /* 47xx usb host */
+#define        BCM47XX_USBD_ID         0x4717          /* 47xx usb device */
+#define        BCM47XX_IPSEC_ID        0x4718          /* 47xx ipsec */
+#define        BCM47XX_ROBO_ID         0x4719          /* 47xx/53xx roboswitch core */
+#define        BCM47XX_USB20H_ID       0x471a          /* 47xx usb 2.0 host */
+#define        BCM47XX_USB20D_ID       0x471b          /* 47xx usb 2.0 device */
+#define        BCM47XX_ATA100_ID       0x471d          /* 47xx parallel ATA */
+#define        BCM47XX_SATAXOR_ID      0x471e          /* 47xx serial ATA & XOR DMA */
+#define        BCM47XX_GIGETH_ID       0x471f          /* 47xx GbE (5700) */
+#define        BCM4712_MIPS_ID         0x4720          /* 4712 base devid */
+#define        BCM4716_DEVICE_ID       0x4722          /* 4716 base devid */
+#define        BCM47XX_USB30H_ID       0x472a          /* 47xx usb 3.0 host */
+#define        BCM47XX_USB30D_ID       0x472b          /* 47xx usb 3.0 device */
+#define BCM47XX_SMBUS_EMU_ID   0x47fe          /* 47xx emulated SMBus device */
+#define        BCM47XX_XOR_EMU_ID      0x47ff          /* 47xx emulated XOR engine */
+#define        EPI41210_DEVICE_ID      0xa0fa          /* bcm4210 */
+#define        EPI41230_DEVICE_ID      0xa10e          /* bcm4230 */
+#define JINVANI_SDIOH_ID       0x4743          /* Jinvani SDIO Gold Host */
+#define BCM27XX_SDIOH_ID       0x2702          /* BCM27xx Standard SDIO Host */
+#define PCIXX21_FLASHMEDIA_ID  0x803b          /* TI PCI xx21 Standard Host Controller */
+#define PCIXX21_SDIOH_ID       0x803c          /* TI PCI xx21 Standard Host Controller */
+#define R5C822_SDIOH_ID                0x0822          /* Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro Host */
+#define JMICRON_SDIOH_ID       0x2381          /* JMicron Standard SDIO Host Controller */
+
+/* Chip IDs */
+#define        BCM4306_CHIP_ID         0x4306          /* 4306 chipcommon chipid */
+#define        BCM4311_CHIP_ID         0x4311          /* 4311 PCIe 802.11a/b/g */
+#define        BCM43111_CHIP_ID        43111           /* 43111 chipcommon chipid (OTP chipid) */
+#define        BCM43112_CHIP_ID        43112           /* 43112 chipcommon chipid (OTP chipid) */
+#define        BCM4312_CHIP_ID         0x4312          /* 4312 chipcommon chipid */
+#define BCM4313_CHIP_ID                0x4313          /* 4313 chip id */
+#define        BCM43131_CHIP_ID        43131           /* 43131 chip id (OTP chipid) */
+#define        BCM4315_CHIP_ID         0x4315          /* 4315 chip id */
+#define        BCM4318_CHIP_ID         0x4318          /* 4318 chipcommon chipid */
+#define        BCM4319_CHIP_ID         0x4319          /* 4319 chip id */
+#define        BCM4320_CHIP_ID         0x4320          /* 4320 chipcommon chipid */
+#define        BCM4321_CHIP_ID         0x4321          /* 4321 chipcommon chipid */
+#define        BCM43217_CHIP_ID        43217           /* 43217 chip id (OTP chipid) */
+#define        BCM4322_CHIP_ID         0x4322          /* 4322 chipcommon chipid */
+#define        BCM43221_CHIP_ID        43221           /* 43221 chipcommon chipid (OTP chipid) */
+#define        BCM43222_CHIP_ID        43222           /* 43222 chipcommon chipid */
+#define        BCM43224_CHIP_ID        43224           /* 43224 chipcommon chipid */
+#define        BCM43225_CHIP_ID        43225           /* 43225 chipcommon chipid */
+#define        BCM43227_CHIP_ID        43227           /* 43227 chipcommon chipid */
+#define        BCM43228_CHIP_ID        43228           /* 43228 chipcommon chipid */
+#define        BCM43226_CHIP_ID        43226           /* 43226 chipcommon chipid */
+#define        BCM43231_CHIP_ID        43231           /* 43231 chipcommon chipid (OTP chipid) */
+#define        BCM43234_CHIP_ID        43234           /* 43234 chipcommon chipid */
+#define        BCM43235_CHIP_ID        43235           /* 43235 chipcommon chipid */
+#define        BCM43236_CHIP_ID        43236           /* 43236 chipcommon chipid */
+#define        BCM43237_CHIP_ID        43237           /* 43237 chipcommon chipid */
+#define        BCM43238_CHIP_ID        43238           /* 43238 chipcommon chipid */
+#define        BCM43239_CHIP_ID        43239           /* 43239 chipcommon chipid */
+#define        BCM43420_CHIP_ID        43420           /* 43222 chipcommon chipid (OTP, RBBU) */
+#define        BCM43421_CHIP_ID        43421           /* 43224 chipcommon chipid (OTP, RBBU) */
+#define        BCM43428_CHIP_ID        43428           /* 43228 chipcommon chipid (OTP, RBBU) */
+#define        BCM43431_CHIP_ID        43431           /* 4331  chipcommon chipid (OTP, RBBU) */
+#define        BCM43460_CHIP_ID        43460           /* 4360  chipcommon chipid (OTP, RBBU) */
+#define        BCM4325_CHIP_ID         0x4325          /* 4325 chip id */
+#define        BCM4328_CHIP_ID         0x4328          /* 4328 chip id */
+#define        BCM4329_CHIP_ID         0x4329          /* 4329 chipcommon chipid */
+#define        BCM4331_CHIP_ID         0x4331          /* 4331 chipcommon chipid */
+#define BCM4336_CHIP_ID                0x4336          /* 4336 chipcommon chipid */
+#define BCM43362_CHIP_ID       43362           /* 43362 chipcommon chipid */
+#define BCM4330_CHIP_ID                0x4330          /* 4330 chipcommon chipid */
+#define BCM6362_CHIP_ID                0x6362          /* 6362 chipcommon chipid */
+#define BCM4314_CHIP_ID                0x4314          /* 4314 chipcommon chipid */
+#define BCM43142_CHIP_ID       43142           /* 43142 chipcommon chipid */
+#define BCM43143_CHIP_ID       43143           /* 43143 chipcommon chipid */
+#define        BCM4324_CHIP_ID         0x4324          /* 4324 chipcommon chipid */
+#define        BCM43242_CHIP_ID        43242           /* 43242 chipcommon chipid */
+#define        BCM43243_CHIP_ID        43243           /* 43243 chipcommon chipid */
+#define BCM4334_CHIP_ID                0x4334          /* 4334 chipcommon chipid */
+#define BCM4335_CHIP_ID                0x4335          /* 4335 chipcommon chipid */
+#define BCM4360_CHIP_ID                0x4360          /* 4360 chipcommon chipid */
+#define BCM4352_CHIP_ID                0x4352          /* 4352 chipcommon chipid */
 #define BCM43526_CHIP_ID       0xAA06
-#define BCM43341_CHIP_ID       43341           
-#define BCM43342_CHIP_ID       43342           
-
+#define BCM43341_CHIP_ID       43341           /* 43341 chipcommon chipid */
+#define BCM43342_CHIP_ID       43342           /* 43342 chipcommon chipid */
 #define BCM4335_CHIP_ID         0x4335
-
-#define        BCM4342_CHIP_ID         4342            
-#define        BCM4402_CHIP_ID         0x4402          
-#define        BCM4704_CHIP_ID         0x4704          
-#define        BCM4706_CHIP_ID         0x5300          
-#define        BCM4710_CHIP_ID         0x4710          
-#define        BCM4712_CHIP_ID         0x4712          
-#define        BCM4716_CHIP_ID         0x4716          
-#define        BCM47162_CHIP_ID        47162           
-#define        BCM4748_CHIP_ID         0x4748          
-#define        BCM4749_CHIP_ID         0x4749          
-#define BCM4785_CHIP_ID                0x4785          
-#define        BCM5350_CHIP_ID         0x5350          
-#define        BCM5352_CHIP_ID         0x5352          
-#define        BCM5354_CHIP_ID         0x5354          
-#define BCM5365_CHIP_ID                0x5365          
-#define        BCM5356_CHIP_ID         0x5356          
-#define        BCM5357_CHIP_ID         0x5357          
-#define        BCM53572_CHIP_ID        53572           
-
-
-#define        BCM4303_PKG_ID          2               
-#define        BCM4309_PKG_ID          1               
-#define        BCM4712LARGE_PKG_ID     0               
-#define        BCM4712SMALL_PKG_ID     1               
-#define        BCM4712MID_PKG_ID       2               
-#define BCM4328USBD11G_PKG_ID  2               
-#define BCM4328USBDUAL_PKG_ID  3               
-#define BCM4328SDIOD11G_PKG_ID 4               
-#define BCM4328SDIODUAL_PKG_ID 5               
-#define BCM4329_289PIN_PKG_ID  0               
-#define BCM4329_182PIN_PKG_ID  1               
-#define BCM5354E_PKG_ID                1               
-#define        BCM4716_PKG_ID          8               
-#define        BCM4717_PKG_ID          9               
-#define        BCM4718_PKG_ID          10              
-#define BCM5356_PKG_NONMODE    1               
-#define BCM5358U_PKG_ID                8               
-#define BCM5358_PKG_ID         9               
-#define BCM47186_PKG_ID                10              
-#define BCM5357_PKG_ID         11              
-#define BCM5356U_PKG_ID                12              
-#define BCM53572_PKG_ID                8               
-#define BCM5357C0_PKG_ID       8               
-#define BCM47188_PKG_ID                9               
-#define BCM5358C0_PKG_ID       0xa             
-#define BCM5356C0_PKG_ID       0xb             
-#define BCM4331TT_PKG_ID        8              
-#define BCM4331TN_PKG_ID        9              
-#define BCM4331TNA0_PKG_ID     0xb             
-#define        BCM4706L_PKG_ID         1               
-
-#define HDLSIM5350_PKG_ID      1               
-#define HDLSIM_PKG_ID          14              
-#define HWSIM_PKG_ID           15              
-#define BCM43224_FAB_CSM       0x8             
-#define BCM43224_FAB_SMIC      0xa             
+#define BCM4350_CHIP_ID                0x4350          /* 4350 chipcommon chipid */
+
+#define        BCM4342_CHIP_ID         4342            /* 4342 chipcommon chipid (OTP, RBBU) */
+#define        BCM4402_CHIP_ID         0x4402          /* 4402 chipid */
+#define        BCM4704_CHIP_ID         0x4704          /* 4704 chipcommon chipid */
+#define        BCM4706_CHIP_ID         0x5300          /* 4706 chipcommon chipid */
+#define BCM4707_CHIP_ID                53010           /* 4707 chipcommon chipid */
+#define BCM53018_CHIP_ID       53018           /* 53018 chipcommon chipid */
+#define BCM4707_CHIP(chipid)   (((chipid) == BCM4707_CHIP_ID) || ((chipid) == BCM53018_CHIP_ID))
+#define        BCM4710_CHIP_ID         0x4710          /* 4710 chipid */
+#define        BCM4712_CHIP_ID         0x4712          /* 4712 chipcommon chipid */
+#define        BCM4716_CHIP_ID         0x4716          /* 4716 chipcommon chipid */
+#define        BCM47162_CHIP_ID        47162           /* 47162 chipcommon chipid */
+#define        BCM4748_CHIP_ID         0x4748          /* 4716 chipcommon chipid (OTP, RBBU) */
+#define        BCM4749_CHIP_ID         0x4749          /* 5357 chipcommon chipid (OTP, RBBU) */
+#define BCM4785_CHIP_ID                0x4785          /* 4785 chipcommon chipid */
+#define        BCM5350_CHIP_ID         0x5350          /* 5350 chipcommon chipid */
+#define        BCM5352_CHIP_ID         0x5352          /* 5352 chipcommon chipid */
+#define        BCM5354_CHIP_ID         0x5354          /* 5354 chipcommon chipid */
+#define BCM5365_CHIP_ID                0x5365          /* 5365 chipcommon chipid */
+#define        BCM5356_CHIP_ID         0x5356          /* 5356 chipcommon chipid */
+#define        BCM5357_CHIP_ID         0x5357          /* 5357 chipcommon chipid */
+#define        BCM53572_CHIP_ID        53572           /* 53572 chipcommon chipid */
+
+/* Package IDs */
+#define        BCM4303_PKG_ID          2               /* 4303 package id */
+#define        BCM4309_PKG_ID          1               /* 4309 package id */
+#define        BCM4712LARGE_PKG_ID     0               /* 340pin 4712 package id */
+#define        BCM4712SMALL_PKG_ID     1               /* 200pin 4712 package id */
+#define        BCM4712MID_PKG_ID       2               /* 225pin 4712 package id */
+#define BCM4328USBD11G_PKG_ID  2               /* 4328 802.11g USB package id */
+#define BCM4328USBDUAL_PKG_ID  3               /* 4328 802.11a/g USB package id */
+#define BCM4328SDIOD11G_PKG_ID 4               /* 4328 802.11g SDIO package id */
+#define BCM4328SDIODUAL_PKG_ID 5               /* 4328 802.11a/g SDIO package id */
+#define BCM4329_289PIN_PKG_ID  0               /* 4329 289-pin package id */
+#define BCM4329_182PIN_PKG_ID  1               /* 4329N 182-pin package id */
+#define BCM5354E_PKG_ID                1               /* 5354E package id */
+#define        BCM4716_PKG_ID          8               /* 4716 package id */
+#define        BCM4717_PKG_ID          9               /* 4717 package id */
+#define        BCM4718_PKG_ID          10              /* 4718 package id */
+#define BCM5356_PKG_NONMODE    1               /* 5356 package without nmode suppport */
+#define BCM5358U_PKG_ID                8               /* 5358U package id */
+#define BCM5358_PKG_ID         9               /* 5358 package id */
+#define BCM47186_PKG_ID                10              /* 47186 package id */
+#define BCM5357_PKG_ID         11              /* 5357 package id */
+#define BCM5356U_PKG_ID                12              /* 5356U package id */
+#define BCM53572_PKG_ID                8               /* 53572 package id */
+#define BCM5357C0_PKG_ID       8               /* 5357c0 package id (the same as 53572) */
+#define BCM47188_PKG_ID                9               /* 47188 package id */
+#define BCM5358C0_PKG_ID       0xa             /* 5358c0 package id */
+#define BCM5356C0_PKG_ID       0xb             /* 5356c0 package id */
+#define BCM4331TT_PKG_ID        8              /* 4331 12x12 package id */
+#define BCM4331TN_PKG_ID        9              /* 4331 12x9 package id */
+#define BCM4331TNA0_PKG_ID     0xb             /* 4331 12x9 package id */
+#define        BCM4706L_PKG_ID         1               /* 4706L package id */
+
+#define HDLSIM5350_PKG_ID      1               /* HDL simulator package id for a 5350 */
+#define HDLSIM_PKG_ID          14              /* HDL simulator package id */
+#define HWSIM_PKG_ID           15              /* Hardware simulator package id */
+#define BCM43224_FAB_CSM       0x8             /* the chip is manufactured by CSM */
+#define BCM43224_FAB_SMIC      0xa             /* the chip is manufactured by SMIC */
 #define BCM4336_WLBGA_PKG_ID   0x8
 #define BCM4330_WLBGA_PKG_ID   0x0
-#define BCM4314PCIE_ARM_PKG_ID         (8 | 0) 
-#define BCM4314SDIO_PKG_ID             (8 | 1) 
-#define BCM4314PCIE_PKG_ID             (8 | 2) 
-#define BCM4314SDIO_ARM_PKG_ID         (8 | 3) 
-#define BCM4314SDIO_FPBGA_PKG_ID       (8 | 4) 
-#define BCM4314DEV_PKG_ID              (8 | 6) 
-
-#define PCIXX21_FLASHMEDIA0_ID 0x8033          
-#define PCIXX21_SDIOH0_ID      0x8034          
-
-
-#define        BFL_BTC2WIRE            0x00000001  
-#define BFL_BTCOEX      0x00000001      
-#define        BFL_PACTRL              0x00000002  
-#define BFL_AIRLINEMODE        0x00000004  
-#define        BFL_ADCDIV              0x00000008  
-#define        BFL_RFPLL               0x00000008  
-#define        BFL_ENETROBO            0x00000010  
-#define        BFL_NOPLLDOWN           0x00000020  
-#define        BFL_CCKHIPWR            0x00000040  
-#define        BFL_ENETADM             0x00000080  
-#define        BFL_ENETVLAN            0x00000100  
-#define        BFL_UNUSED              0x00000200
-#define BFL_NOPCI              0x00000400  
-#define BFL_FEM                        0x00000800  
-#define BFL_EXTLNA             0x00001000  
-#define BFL_HGPA               0x00002000  
-#define        BFL_BTC2WIRE_ALTGPIO    0x00004000  
-#define        BFL_ALTIQ               0x00008000  
-#define BFL_NOPA               0x00010000  
-#define BFL_RSSIINV            0x00020000  
-#define BFL_PAREF              0x00040000  
-#define BFL_3TSWITCH           0x00080000  
-#define BFL_PHASESHIFT         0x00100000  
-#define BFL_BUCKBOOST          0x00200000  
-#define BFL_FEM_BT             0x00400000  
-#define BFL_NOCBUCK            0x00800000  
-#define BFL_CCKFAVOREVM                0x01000000  
-#define BFL_PALDO              0x02000000  
-#define BFL_LNLDO2_2P5         0x04000000  
+#define BCM4314PCIE_ARM_PKG_ID         (8 | 0) /* 4314 QFN PCI package id, bit 3 tie high */
+#define BCM4314SDIO_PKG_ID             (8 | 1) /* 4314 QFN SDIO package id */
+#define BCM4314PCIE_PKG_ID             (8 | 2) /* 4314 QFN PCI (ARM-less) package id */
+#define BCM4314SDIO_ARM_PKG_ID         (8 | 3) /* 4314 QFN SDIO (ARM-less) package id */
+#define BCM4314SDIO_FPBGA_PKG_ID       (8 | 4) /* 4314 FpBGA SDIO package id */
+#define BCM4314DEV_PKG_ID              (8 | 6) /* 4314 Developement package id */
+
+#define BCM4707_PKG_ID         1               /* 4707 package id */
+#define BCM4708_PKG_ID         2               /* 4708 package id */
+#define BCM4709_PKG_ID         0               /* 4709 package id */
+
+#define PCIXX21_FLASHMEDIA0_ID 0x8033          /* TI PCI xx21 Standard Host Controller */
+#define PCIXX21_SDIOH0_ID      0x8034          /* TI PCI xx21 Standard Host Controller */
+
+#define BCM4335_WLCSP_PKG_ID   (0x0)   /* WLCSP Module/Mobile SDIO/HSIC. */
+#define BCM4335_FCBGA_PKG_ID   (0x1)   /* FCBGA PC/Embeded/Media PCIE/SDIO */
+#define BCM4335_WLBGA_PKG_ID   (0x2)   /* WLBGA COB/Mobile SDIO/HSIC. */
+#define BCM4335_FCBGAD_PKG_ID  (0x3)   /* FCBGA Debug Debug/Dev All if's. */
+#define BCM4335_PKG_MASK       (0x3)
+
+/* boardflags */
+#define        BFL_BTC2WIRE            0x00000001  /* old 2wire Bluetooth coexistence, OBSOLETE */
+#define BFL_BTCOEX      0x00000001      /* Board supports BTCOEX */
+#define        BFL_PACTRL              0x00000002  /* Board has gpio 9 controlling the PA */
+#define BFL_AIRLINEMODE        0x00000004  /* Board implements gpio 13 radio disable indication, UNUSED */
+#define        BFL_ADCDIV              0x00000008  /* Board has the rssi ADC divider */
+#define BFL_DIS_256QAM         0x00000008
+#define        BFL_ENETROBO            0x00000010  /* Board has robo switch or core */
+#define        BFL_NOPLLDOWN           0x00000020  /* Not ok to power down the chip pll and oscillator */
+#define        BFL_CCKHIPWR            0x00000040  /* Can do high-power CCK transmission */
+#define        BFL_ENETADM             0x00000080  /* Board has ADMtek switch */
+#define        BFL_ENETVLAN            0x00000100  /* Board has VLAN capability */
+#define        BFL_LTECOEX             0x00000200  /* Board has LTE coex capability */
+#define BFL_NOPCI              0x00000400  /* Board leaves PCI floating */
+#define BFL_FEM                        0x00000800  /* Board supports the Front End Module */
+#define BFL_EXTLNA             0x00001000  /* Board has an external LNA in 2.4GHz band */
+#define BFL_HGPA               0x00002000  /* Board has a high gain PA */
+#define        BFL_BTC2WIRE_ALTGPIO    0x00004000
+/* Board's BTC 2wire is in the alternate gpios OBSLETE */
+#define        BFL_ALTIQ               0x00008000  /* Alternate I/Q settings */
+#define BFL_NOPA               0x00010000  /* Board has no PA */
+#define BFL_RSSIINV            0x00020000  /* Board's RSSI uses positive slope(not TSSI) */
+#define BFL_PAREF              0x00040000  /* Board uses the PARef LDO */
+#define BFL_3TSWITCH           0x00080000  /* Board uses a triple throw switch shared with BT */
+#define BFL_PHASESHIFT         0x00100000  /* Board can support phase shifter */
+#define BFL_BUCKBOOST          0x00200000  /* Power topology uses BUCKBOOST */
+#define BFL_FEM_BT             0x00400000  /* Board has FEM and switch to share antenna w/ BT */
+#define BFL_RXCHAIN_OFF_BT 0x00400000 /* one rxchain is to be shut off when BT is active */
+#define BFL_NOCBUCK            0x00800000  /* Power topology doesn't use CBUCK */
+#define BFL_CCKFAVOREVM                0x01000000  /* Favor CCK EVM over spectral mask */
+#define BFL_PALDO              0x02000000  /* Power topology uses PALDO */
+#define BFL_LNLDO2_2P5         0x04000000  /* Select 2.5V as LNLDO2 output voltage */
 #define BFL_FASTPWR            0x08000000
-#define BFL_UCPWRCTL_MININDX   0x08000000  
-#define BFL_EXTLNA_5GHz                0x10000000  
-#define BFL_TRSW_1by2          0x20000000  
-#define BFL_LO_TRSW_R_5GHz     0x40000000  
-#define BFL_ELNA_GAINDEF       0x80000000  
-#define BFL_EXTLNA_TX  0x20000000      
-
-
-#define BFL2_RXBB_INT_REG_DIS  0x00000001  
-#define BFL2_APLL_WAR          0x00000002  
-#define BFL2_TXPWRCTRL_EN      0x00000004  
-#define BFL2_2X4_DIV           0x00000008  
-#define BFL2_5G_PWRGAIN                0x00000010  
-#define BFL2_PCIEWAR_OVR       0x00000020  
-#define BFL2_CAESERS_BRD       0x00000040  
-#define BFL2_BTC3WIRE          0x00000080  
-#define BFL2_BTCLEGACY          0x00000080  
-#define BFL2_SKWRKFEM_BRD      0x00000100  
-#define BFL2_SPUR_WAR          0x00000200  
-#define BFL2_GPLL_WAR          0x00000400  
-#define BFL2_TRISTATE_LED      0x00000800  
-#define BFL2_SINGLEANT_CCK     0x00001000  
-#define BFL2_2G_SPUR_WAR       0x00002000  
-#define BFL2_BPHY_ALL_TXCORES  0x00004000  
-#define BFL2_FCC_BANDEDGE_WAR  0x00008000  
-#define BFL2_GPLL_WAR2         0x00010000  
+#define BFL_UCPWRCTL_MININDX   0x08000000  /* Enforce min power index to avoid FEM damage */
+#define BFL_EXTLNA_5GHz                0x10000000  /* Board has an external LNA in 5GHz band */
+#define BFL_TRSW_1by2          0x20000000  /* Board has 2 TRSW's in 1by2 designs */
+#define BFL_GAINBOOSTA01        0x20000000  /* 5g Gainboost for core0 and core1 */
+#define BFL_LO_TRSW_R_5GHz     0x40000000  /* In 5G do not throw TRSW to T for clipLO gain */
+#define BFL_ELNA_GAINDEF       0x80000000  /* Backoff InitGain based on elna_2g/5g field
+                                            * when this flag is set
+                                            */
+#define BFL_EXTLNA_TX  0x20000000      /* Temp boardflag to indicate to */
+
+/* boardflags2 */
+#define BFL2_RXBB_INT_REG_DIS  0x00000001  /* Board has an external rxbb regulator */
+#define BFL2_APLL_WAR          0x00000002  /* Flag to implement alternative A-band PLL settings */
+#define BFL2_TXPWRCTRL_EN      0x00000004  /* Board permits enabling TX Power Control */
+#define BFL2_2X4_DIV           0x00000008  /* Board supports the 2X4 diversity switch */
+#define BFL2_5G_PWRGAIN                0x00000010  /* Board supports 5G band power gain */
+#define BFL2_PCIEWAR_OVR       0x00000020  /* Board overrides ASPM and Clkreq settings */
+#define BFL2_CAESERS_BRD       0x00000040  /* Board is Caesers brd (unused by sw) */
+#define BFL2_BTC3WIRE          0x00000080  /* Board support legacy 3 wire or 4 wire */
+#define BFL2_BTCLEGACY          0x00000080  /* Board support legacy 3/4 wire, to replace
+                                            * BFL2_BTC3WIRE
+                                            */
+#define BFL2_SKWRKFEM_BRD      0x00000100  /* 4321mcm93 board uses Skyworks FEM */
+#define BFL2_SPUR_WAR          0x00000200  /* Board has a WAR for clock-harmonic spurs */
+#define BFL2_GPLL_WAR          0x00000400  /* Flag to narrow G-band PLL loop b/w */
+#define BFL2_TRISTATE_LED      0x00000800  /* Tri-state the LED */
+#define BFL2_SINGLEANT_CCK     0x00001000  /* Tx CCK pkts on Ant 0 only */
+#define BFL2_2G_SPUR_WAR       0x00002000  /* WAR to reduce and avoid clock-harmonic spurs in 2G */
+#define BFL2_BPHY_ALL_TXCORES  0x00004000  /* Transmit bphy frames using all tx cores */
+#define BFL2_FCC_BANDEDGE_WAR  0x00008000  /* Activates WAR to improve FCC bandedge performance */
+#define BFL2_GPLL_WAR2         0x00010000  /* Flag to widen G-band PLL loop b/w */
 #define BFL2_IPALVLSHIFT_3P3    0x00020000
-#define BFL2_INTERNDET_TXIQCAL  0x00040000  
-#define BFL2_XTALBUFOUTEN       0x00080000  
-                               
-                               
-
-#define BFL2_ANAPACTRL_2G      0x00100000  
-#define BFL2_ANAPACTRL_5G      0x00200000  
-#define BFL2_ELNACTRL_TRSW_2G  0x00400000  
-#define BFL2_BT_SHARE_ANT0     0x00800000  
-#define BFL2_TEMPSENSE_HIGHER  0x01000000  
-#define BFL2_BTC3WIREONLY       0x02000000  
-#define BFL2_PWR_NOMINAL       0x04000000  
-#define BFL2_EXTLNA_PWRSAVE    0x08000000  
-                                               
+#define BFL2_INTERNDET_TXIQCAL  0x00040000  /* Use internal envelope detector for TX IQCAL */
+#define BFL2_XTALBUFOUTEN       0x00080000  /* Keep the buffered Xtal output from radio on */
+                               /* Most drivers will turn it off without this flag */
+                               /* to save power. */
+
+#define BFL2_ANAPACTRL_2G      0x00100000  /* 2G ext PAs are controlled by analog PA ctrl lines */
+#define BFL2_ANAPACTRL_5G      0x00200000  /* 5G ext PAs are controlled by analog PA ctrl lines */
+#define BFL2_ELNACTRL_TRSW_2G  0x00400000  /* AZW4329: 2G gmode_elna_gain controls TR Switch */
+#define BFL2_BT_SHARE_ANT0     0x00800000 /* WLAN/BT share antenna 0 */
+#define BFL2_BT_SHARE_BM_BIT0  0x00800000  /* bit 0 of WLAN/BT shared core bitmap */
+#define BFL2_TEMPSENSE_HIGHER  0x01000000  /* The tempsense threshold can sustain higher value
+                                            * than programmed. The exact delta is decided by
+                                            * driver per chip/boardtype. This can be used
+                                            * when tempsense qualification happens after shipment
+                                            */
+#define BFL2_BTC3WIREONLY       0x02000000  /* standard 3 wire btc only.  4 wire not supported */
+#define BFL2_PWR_NOMINAL       0x04000000  /* 0: power reduction on, 1: no power reduction */
+#define BFL2_EXTLNA_PWRSAVE    0x08000000  /* boardflag to enable ucode to apply power save */
+                                               /* ucode control of eLNA during Tx */
 #define BFL2_4313_RADIOREG     0x10000000
-                                                                          
-#define BFL2_SDR_EN            0x20000000      
-
-
-#define        BOARD_GPIO_BTC3W_IN     0x850   
-#define        BOARD_GPIO_BTC3W_OUT    0x020   
-#define        BOARD_GPIO_BTCMOD_IN    0x010   
-#define        BOARD_GPIO_BTCMOD_OUT   0x020   
-#define        BOARD_GPIO_BTC_IN       0x080   
-#define        BOARD_GPIO_BTC_OUT      0x100   
-#define        BOARD_GPIO_PACTRL       0x200   
-#define BOARD_GPIO_12          0x1000  
-#define BOARD_GPIO_13          0x2000  
-#define BOARD_GPIO_BTC4_IN     0x0800  
-#define BOARD_GPIO_BTC4_BT     0x2000  
-#define BOARD_GPIO_BTC4_STAT   0x4000  
-#define BOARD_GPIO_BTC4_WLAN   0x8000  
-#define        BOARD_GPIO_1_WLAN_PWR   0x02    
-#define        BOARD_GPIO_3_WLAN_PWR   0x08    
-#define        BOARD_GPIO_4_WLAN_PWR   0x10    
-
-#define GPIO_BTC4W_OUT_4312  0x010  
-#define GPIO_BTC4W_OUT_43224  0x020  
-#define GPIO_BTC4W_OUT_43224_SHARED  0x0e0  
-#define GPIO_BTC4W_OUT_43225  0x0e0  
-#define GPIO_BTC4W_OUT_43421  0x020  
-#define GPIO_BTC4W_OUT_4313  0x060  
-#define GPIO_BTC4W_OUT_4331_SHARED  0x010  
-
-#define        PCI_CFG_GPIO_SCS        0x10    
-#define PCI_CFG_GPIO_HWRAD     0x20    
-#define PCI_CFG_GPIO_XTAL      0x40    
-#define PCI_CFG_GPIO_PLL       0x80    
-
-
-#define PLL_DELAY              150             
-#define FREF_DELAY             200             
-#define MIN_SLOW_CLK           32              
-#define        XTAL_ON_DELAY           1000            
-
-
-
+                                                                          /*  board rework */
+#define BFL2_DYNAMIC_VMID      0x10000000  /* boardflag to enable dynamic Vmid idle TSSI CAL */
+#define BFL2_SDR_EN            0x20000000  /* SDR enabled or disabled */
+#define BFL2_LNA1BYPFORTR2G    0x40000000  /* acphy, enable lna1 bypass for clip gain, 2g */
+#define BFL2_LNA1BYPFORTR5G    0x80000000  /* acphy, enable lna1 bypass for clip gain, 5g */
+
+/* SROM 11 - 11ac boardflag definitions */
+#define BFL_SROM11_BTCOEX  0x00000001  /* Board supports BTCOEX */
+#define BFL_SROM11_WLAN_BT_SH_XTL  0x00000002  /* bluetooth and wlan share same crystal */
+#define BFL_SROM11_EXTLNA      0x00001000  /* Board has an external LNA in 2.4GHz band */
+#define BFL_SROM11_EXTLNA_5GHz 0x10000000  /* Board has an external LNA in 5GHz band */
+#define BFL_SROM11_GAINBOOSTA01        0x20000000  /* 5g Gainboost for core0 and core1 */
+#define BFL2_SROM11_APLL_WAR   0x00000002  /* Flag to implement alternative A-band PLL settings */
+#define BFL2_SROM11_ANAPACTRL_2G  0x00100000  /* 2G ext PAs are ctrl-ed by analog PA ctrl lines */
+#define BFL2_SROM11_ANAPACTRL_5G  0x00200000  /* 5G ext PAs are ctrl-ed by analog PA ctrl lines */
+
+/* boardflags3 */
+#define BFL3_FEMCTRL_SUB       0x00000007  /* acphy, subrevs of femctrl on top of srom_femctrl */
+#define BFL3_RCAL_WAR          0x00000008  /* acphy, rcal war active on this board (4335a0) */
+#define BFL3_TXGAINTBLID       0x00000070  /* acphy, txgain table id */
+#define BFL3_TXGAINTBLID_SHIFT 0x4         /* acphy, txgain table id shift bit */
+#define BFL3_TSSI_DIV_WAR      0x00000080  /* acphy, Seperate paparam for 20/40/80 */
+#define BFL3_TSSI_DIV_WAR_SHIFT        0x7         /* acphy, Seperate paparam for 20/40/80 shift bit */
+#define BFL3_FEMTBL_FROM_NVRAM  0x00000100  /* acphy, femctrl table is read from nvram */
+#define BFL3_FEMTBL_FROM_NVRAM_SHIFT  0x8         /* acphy, femctrl table is read from nvram */
+#define BFL3_AGC_CFG_2G         0x00000200  /* acphy, gain control configuration for 2G */
+#define BFL3_AGC_CFG_5G         0x00000400  /* acphy, gain control configuration for 5G */
+#define BFL3_PPR_BIT_EXT        0x00000800  /* acphy, bit position for 1bit extension for ppr */
+#define BFL3_PPR_BIT_EXT_SHIFT  11          /* acphy, bit shift for 1bit extension for ppr */
+#define BFL3_BBPLL_SPR_MODE_DIS 0x00001000  /* acphy, disables bbpll spur modes */
+#define BFL3_RCAL_OTP_VAL_EN    0x00002000  /* acphy, to read rcal_trim value from otp */
+#define BFL3_2GTXGAINTBL_BLANK  0x00004000  /* acphy, blank the first X ticks of 2g gaintbl */
+#define BFL3_2GTXGAINTBL_BLANK_SHIFT 14     /* acphy, blank the first X ticks of 2g gaintbl */
+#define BFL3_5GTXGAINTBL_BLANK  0x00008000  /* acphy, blank the first X ticks of 5g gaintbl */
+#define BFL3_5GTXGAINTBL_BLANK_SHIFT 15     /* acphy, blank the first X ticks of 5g gaintbl */
+#define BFL3_BT_SHARE_BM_BIT1   0x40000000  /* bit 1 of WLAN/BT shared core bitmap */
+#define BFL3_PHASETRACK_MAX_ALPHABETA    0x00010000  /* acphy, to max out alpha,beta to 511 */
+#define BFL3_PHASETRACK_MAX_ALPHABETA_SHIFT 16       /* acphy, to max out alpha,beta to 511 */
+#define BFL3_BT_SHARE_BM_BIT1 0x40000000 /* bit 1 of WLAN/BT shared core bitmap */
+#define BFL3_EN_NONBRCM_TXBF      0x10000000  /* acphy, enable non-brcm TXBF */
+#define BFL3_EN_P2PLINK_TXBF      0x20000000  /* acphy, enable TXBF in p2p links */
+
+/* board specific GPIO assignment, gpio 0-3 are also customer-configurable led */
+#define        BOARD_GPIO_BTC3W_IN     0x850   /* bit 4 is RF_ACTIVE, bit 6 is STATUS, bit 11 is PRI */
+#define        BOARD_GPIO_BTC3W_OUT    0x020   /* bit 5 is TX_CONF */
+#define        BOARD_GPIO_BTCMOD_IN    0x010   /* bit 4 is the alternate BT Coexistence Input */
+#define        BOARD_GPIO_BTCMOD_OUT   0x020   /* bit 5 is the alternate BT Coexistence Out */
+#define        BOARD_GPIO_BTC_IN       0x080   /* bit 7 is BT Coexistence Input */
+#define        BOARD_GPIO_BTC_OUT      0x100   /* bit 8 is BT Coexistence Out */
+#define        BOARD_GPIO_PACTRL       0x200   /* bit 9 controls the PA on new 4306 boards */
+#define BOARD_GPIO_12          0x1000  /* gpio 12 */
+#define BOARD_GPIO_13          0x2000  /* gpio 13 */
+#define BOARD_GPIO_BTC4_IN     0x0800  /* gpio 11, coex4, in */
+#define BOARD_GPIO_BTC4_BT     0x2000  /* gpio 12, coex4, bt active */
+#define BOARD_GPIO_BTC4_STAT   0x4000  /* gpio 14, coex4, status */
+#define BOARD_GPIO_BTC4_WLAN   0x8000  /* gpio 15, coex4, wlan active */
+#define        BOARD_GPIO_1_WLAN_PWR   0x02    /* throttle WLAN power on X21 board */
+#define        BOARD_GPIO_3_WLAN_PWR   0x08    /* throttle WLAN power on X28 board */
+#define        BOARD_GPIO_4_WLAN_PWR   0x10    /* throttle WLAN power on X19 board */
+
+#define GPIO_BTC4W_OUT_4312  0x010  /* bit 4 is BT_IODISABLE */
+#define GPIO_BTC4W_OUT_43224  0x020  /* bit 5 is BT_IODISABLE */
+#define GPIO_BTC4W_OUT_43224_SHARED  0x0e0  /* bit 5 is BT_IODISABLE */
+#define GPIO_BTC4W_OUT_43225  0x0e0  /* bit 5 BT_IODISABLE, bit 6 SW_BT, bit 7 SW_WL */
+#define GPIO_BTC4W_OUT_43421  0x020  /* bit 5 is BT_IODISABLE */
+#define GPIO_BTC4W_OUT_4313  0x060  /* bit 5 SW_BT, bit 6 SW_WL */
+#define GPIO_BTC4W_OUT_4331_SHARED  0x010  /* GPIO 4  */
+
+#define        PCI_CFG_GPIO_SCS        0x10    /* PCI config space bit 4 for 4306c0 slow clock source */
+#define PCI_CFG_GPIO_HWRAD     0x20    /* PCI config space GPIO 13 for hw radio disable */
+#define PCI_CFG_GPIO_XTAL      0x40    /* PCI config space GPIO 14 for Xtal power-up */
+#define PCI_CFG_GPIO_PLL       0x80    /* PCI config space GPIO 15 for PLL power-down */
+
+/* power control defines */
+#define PLL_DELAY              150             /* us pll on delay */
+#define FREF_DELAY             200             /* us fref change delay */
+#define MIN_SLOW_CLK           32              /* us Slow clock period */
+#define        XTAL_ON_DELAY           1000            /* us crystal power-on delay */
+
+
+/* 43341 Boards */
 #define BCM943341WLABGS_SSID   0x062d
 
+/* 43342 Boards */
+#define BCM943342FCAGBI_SSID   0x0641
 
+/* # of GPIO pins */
 #define GPIO_NUMPINS           32
 
-
+/* These values are used by dhd host driver. */
 #define RDL_RAM_BASE_4319 0x60000000
 #define RDL_RAM_BASE_4329 0x60000000
 #define RDL_RAM_SIZE_4319 0x48000
 #define RDL_RAM_BASE_4328 0x80000000
 #define RDL_RAM_SIZE_4322 0x60000
 #define RDL_RAM_BASE_4322 0x60000000
-
-
+#define RDL_RAM_SIZE_4360  0xA0000
+#define RDL_RAM_BASE_4360  0x60000000
+#define RDL_RAM_SIZE_43242  0x90000
+#define RDL_RAM_BASE_43242  0x60000000
+#define RDL_RAM_SIZE_43143  0x70000
+#define RDL_RAM_BASE_43143  0x60000000
+#define RDL_RAM_SIZE_4350  0xC0000
+#define RDL_RAM_BASE_4350  0x180800
+
+/* generic defs for nvram "muxenab" bits
+* Note: these differ for 4335a0. refer bcmchipc.h for specific mux options.
+*/
 #define MUXENAB_UART           0x00000001
 #define MUXENAB_GPIO           0x00000002
-#define MUXENAB_ERCX           0x00000004      
+#define MUXENAB_ERCX           0x00000004      /* External Radio BT coex */
 #define MUXENAB_JTAG           0x00000008
-#define MUXENAB_HOST_WAKE      0x00000010      
+#define MUXENAB_HOST_WAKE      0x00000010      /* configure GPIO for SDIO host_wake */
 #define MUXENAB_I2S_EN         0x00000020
 #define MUXENAB_I2S_MASTER     0x00000040
 #define MUXENAB_I2S_FULL       0x00000080
 #define MUXENAB_RFSWCTRL2      0x00000800
 #define MUXENAB_SECI           0x00001000
 #define MUXENAB_BT_LEGACY      0x00002000
-#define MUXENAB_HOST_WAKE1     0x00004000      
-
+#define MUXENAB_HOST_WAKE1     0x00004000      /* configure alternative GPIO for SDIO host_wake */
 
+/* Boot flags */
 #define FLASH_KERNEL_NFLASH    0x00000001
 #define FLASH_BOOT_NFLASH      0x00000002
 
-#endif
+#endif /* _BCMDEVS_H */
index e8f0a87..9af27bc 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Byte order utilities
  *
- * Copyright (C) 1999-2011, Broadcom Corporation
- *
+ * Copyright (C) 1999-2013, Broadcom Corporation
+ * 
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * copyright notice and this permission notice appear in all copies.
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- *  $Id: bcmendian.h,v 1.36 2009-11-09 05:29:43 Exp $
+ *  $Id: bcmendian.h 241182 2011-02-17 21:50:03Z $
  *
  * This file by default provides proper behavior on little-endian architectures.
  * On big-endian architectures, IL_BIGENDIAN should be defined.
  */
 
-
 #ifndef _BCMENDIAN_H_
 #define _BCMENDIAN_H_
 
 #include <typedefs.h>
 
-
+/* Reverse the bytes in a 16-bit value */
 #define BCMSWAP16(val) \
        ((uint16)((((uint16)(val) & (uint16)0x00ffU) << 8) | \
                  (((uint16)(val) & (uint16)0xff00U) >> 8)))
 
-
+/* Reverse the bytes in a 32-bit value */
 #define BCMSWAP32(val) \
        ((uint32)((((uint32)(val) & (uint32)0x000000ffU) << 24) | \
                  (((uint32)(val) & (uint32)0x0000ff00U) <<  8) | \
                  (((uint32)(val) & (uint32)0x00ff0000U) >>  8) | \
                  (((uint32)(val) & (uint32)0xff000000U) >> 24)))
 
-
+/* Reverse the two 16-bit halves of a 32-bit value */
 #define BCMSWAP32BY16(val) \
        ((uint32)((((uint32)(val) & (uint32)0x0000ffffU) << 16) | \
                  (((uint32)(val) & (uint32)0xffff0000U) >> 16)))
 
-
+/* Byte swapping macros
+ *    Host <=> Network (Big Endian) for 16- and 32-bit values
+ *    Host <=> Little-Endian for 16- and 32-bit values
+ */
 #ifndef hton16
 #define HTON16(i) BCMSWAP16(i)
 #define        hton16(i) bcmswap16(i)
 #define htol16(i) (i)
 #define HTOL32(i) (i)
 #define htol32(i) (i)
-#endif
+#endif /* hton16 */
 
 #define ltoh16_buf(buf, i)
 #define htol16_buf(buf, i)
 
-
+/* Unaligned loads and stores in host byte order */
 #define load32_ua(a)           ltoh32_ua(a)
 #define store32_ua(a, v)       htol32_ua_store(v, a)
 #define load16_ua(a)           ltoh16_ua(a)
@@ -92,7 +94,9 @@
 
 #ifdef __GNUC__
 
-
+/* GNU macro versions avoid referencing the argument multiple times, while also
+ * avoiding the -fno-inline used in ROM builds.
+ */
 
 #define bcmswap16(val) ({ \
        uint16 _val = (val); \
        _NTOH32_UA(_bytes); \
 })
 
-#else
-
+#else /* !__GNUC__ */
 
+/* Inline versions avoid referencing the argument multiple times */
 static INLINE uint16
 bcmswap16(uint16 val)
 {
@@ -191,9 +195,9 @@ bcmswap32by16(uint32 val)
        return BCMSWAP32BY16(val);
 }
 
-
-
-
+/* Reverse pairs of bytes in a buffer (not for high-performance use) */
+/* buf - start of buffer of shorts to swap */
+/* len  - byte length of buffer */
 static INLINE void
 bcmswap16_buf(uint16 *buf, uint len)
 {
@@ -205,7 +209,9 @@ bcmswap16_buf(uint16 *buf, uint len)
        }
 }
 
-
+/*
+ * Store 16-bit value to unaligned little-endian byte array.
+ */
 static INLINE void
 htol16_ua_store(uint16 val, uint8 *bytes)
 {
@@ -213,7 +219,9 @@ htol16_ua_store(uint16 val, uint8 *bytes)
        bytes[1] = val >> 8;
 }
 
-
+/*
+ * Store 32-bit value to unaligned little-endian byte array.
+ */
 static INLINE void
 htol32_ua_store(uint32 val, uint8 *bytes)
 {
@@ -223,7 +231,9 @@ htol32_ua_store(uint32 val, uint8 *bytes)
        bytes[3] = val >> 24;
 }
 
-
+/*
+ * Store 16-bit value to unaligned network-(big-)endian byte array.
+ */
 static INLINE void
 hton16_ua_store(uint16 val, uint8 *bytes)
 {
@@ -231,7 +241,9 @@ hton16_ua_store(uint16 val, uint8 *bytes)
        bytes[1] = val & 0xff;
 }
 
-
+/*
+ * Store 32-bit value to unaligned network-(big-)endian byte array.
+ */
 static INLINE void
 hton32_ua_store(uint32 val, uint8 *bytes)
 {
@@ -241,33 +253,41 @@ hton32_ua_store(uint32 val, uint8 *bytes)
        bytes[3] = val & 0xff;
 }
 
-
+/*
+ * Load 16-bit value from unaligned little-endian byte array.
+ */
 static INLINE uint16
 ltoh16_ua(const void *bytes)
 {
        return _LTOH16_UA((const uint8 *)bytes);
 }
 
-
+/*
+ * Load 32-bit value from unaligned little-endian byte array.
+ */
 static INLINE uint32
 ltoh32_ua(const void *bytes)
 {
        return _LTOH32_UA((const uint8 *)bytes);
 }
 
-
+/*
+ * Load 16-bit value from unaligned big-(network-)endian byte array.
+ */
 static INLINE uint16
 ntoh16_ua(const void *bytes)
 {
        return _NTOH16_UA((const uint8 *)bytes);
 }
 
-
+/*
+ * Load 32-bit value from unaligned big-(network-)endian byte array.
+ */
 static INLINE uint32
 ntoh32_ua(const void *bytes)
 {
        return _NTOH32_UA((const uint8 *)bytes);
 }
 
-#endif
-#endif
+#endif /* !__GNUC__ */
+#endif /* !_BCMENDIAN_H_ */
index a493c53..600ec0d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Misc useful os-independent macros and functions.
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -15,7 +15,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: bcmutils.h 347624 2012-07-27 10:49:56Z $
+ * $Id: bcmutils.h 382763 2013-02-04 10:21:08Z $
  */
 
 #ifndef        _bcmutils_h_
@@ -33,15 +33,15 @@ extern "C" {
 #include <wlioctl.h>
 #endif
 
-
-#define _BCM_U 0x01
-#define _BCM_L 0x02
-#define _BCM_D 0x04
-#define _BCM_C 0x08
-#define _BCM_P 0x10
-#define _BCM_S 0x20
-#define _BCM_X 0x40
-#define _BCM_SP        0x80
+/* ctype replacement */
+#define _BCM_U 0x01    /* upper */
+#define _BCM_L 0x02    /* lower */
+#define _BCM_D 0x04    /* digit */
+#define _BCM_C 0x08    /* cntrl */
+#define _BCM_P 0x10    /* punct */
+#define _BCM_S 0x20    /* white space (space/lf/tab) */
+#define _BCM_X 0x40    /* hex digit */
+#define _BCM_SP        0x80    /* hard space (0x20) */
 
 extern const unsigned char bcm_ctype[];
 #define bcm_ismask(x)  (bcm_ctype[(int)(unsigned char)(x)])
@@ -60,22 +60,29 @@ extern const unsigned char bcm_ctype[];
 #define bcm_tolower(c) (bcm_isupper((c)) ? ((c) + 'a' - 'A') : (c))
 #define bcm_toupper(c) (bcm_islower((c)) ? ((c) + 'A' - 'a') : (c))
 
-
+/* Buffer structure for collecting string-formatted data
+* using bcm_bprintf() API.
+* Use bcm_binit() to initialize before use
+*/
 
 struct bcmstrbuf {
-       char *buf;
-       unsigned int size;
-       char *origbuf;
-       unsigned int origsize;
+       char *buf;      /* pointer to current position in origbuf */
+       unsigned int size;      /* current (residual) size in bytes */
+       char *origbuf;  /* unmodified pointer to orignal buffer */
+       unsigned int origsize;  /* unmodified orignal buffer size in bytes */
 };
 
-
+/* ** driver-only section ** */
 #ifdef BCMDRIVER
 #include <osl.h>
 
-#define GPIO_PIN_NOTDEFINED    0x20
-
+#define GPIO_PIN_NOTDEFINED    0x20    /* Pin not defined */
 
+/*
+ * Spin at most 'us' microseconds while 'exp' is true.
+ * Caller should explicitly test 'exp' when this completes
+ * and take appropriate error action if 'exp' is still true.
+ */
 #define SPINWAIT(exp, us) { \
        uint countdown = (us) + 9; \
        while ((exp) && (countdown >= 10)) {\
@@ -84,84 +91,96 @@ struct bcmstrbuf {
        } \
 }
 
-
+/* osl multi-precedence packet queue */
 #ifndef PKTQ_LEN_DEFAULT
-#define PKTQ_LEN_DEFAULT        128
+#define PKTQ_LEN_DEFAULT        128    /* Max 128 packets */
 #endif
 #ifndef PKTQ_MAX_PREC
-#define PKTQ_MAX_PREC           16
+#define PKTQ_MAX_PREC           16     /* Maximum precedence levels */
 #endif
 
 typedef struct pktq_prec {
-       void *head;
-       void *tail;
-       uint16 len;
-       uint16 max;
+       void *head;     /* first packet to dequeue */
+       void *tail;     /* last packet to dequeue */
+       uint16 len;     /* number of queued packets */
+       uint16 max;     /* maximum number of queued packets */
 } pktq_prec_t;
 
 #ifdef PKTQ_LOG
 typedef struct {
-       uint32 requested;    
-       uint32 stored;       
-       uint32 saved;        
-       uint32 selfsaved;    
-       uint32 full_dropped; 
-       uint32 dropped;      
-       uint32 sacrificed;   
-       uint32 busy;         
-       uint32 retry;        
-       uint32 ps_retry;     
-       uint32 retry_drop;   
-       uint32 max_avail;    
-       uint32 max_used;     
-       uint32 queue_capacity; 
+       uint32 requested;    /* packets requested to be stored */
+       uint32 stored;       /* packets stored */
+       uint32 saved;        /* packets saved,
+                                   because a lowest priority queue has given away one packet
+                             */
+       uint32 selfsaved;    /* packets saved,
+                                   because an older packet from the same queue has been dropped
+                             */
+       uint32 full_dropped; /* packets dropped,
+                                   because pktq is full with higher precedence packets
+                             */
+       uint32 dropped;      /* packets dropped because pktq per that precedence is full */
+       uint32 sacrificed;   /* packets dropped,
+                                   in order to save one from a queue of a highest priority
+                             */
+       uint32 busy;         /* packets droped because of hardware/transmission error */
+       uint32 retry;        /* packets re-sent because they were not received */
+       uint32 ps_retry;     /* packets retried again prior to moving power save mode */
+       uint32 retry_drop;   /* packets finally dropped after retry limit */
+       uint32 max_avail;    /* the high-water mark of the queue capacity for packets -
+                                   goes to zero as queue fills
+                             */
+       uint32 max_used;     /* the high-water mark of the queue utilisation for packets -
+                                                       increases with use ('inverse' of max_avail)
+                                         */
+       uint32 queue_capacity; /* the maximum capacity of the queue */
+       uint32 rtsfail;        /* count of rts attempts that failed to receive cts */
+       uint32 acked;          /* count of packets sent (acked) successfully */
 } pktq_counters_t;
-#endif 
+#endif /* PKTQ_LOG */
 
 
 #define PKTQ_COMMON    \
-       uint16 num_prec;                                \
-       uint16 hi_prec;                 \
-       uint16 max;                                                     \
-       uint16 len;             
-
+       uint16 num_prec;        /* number of precedences in use */                      \
+       uint16 hi_prec;         /* rapid dequeue hint (>= highest non-empty prec) */    \
+       uint16 max;             /* total max packets */                                 \
+       uint16 len;             /* total number of packets */
 
+/* multi-priority pkt queue */
 struct pktq {
        PKTQ_COMMON
-       
+       /* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */
        struct pktq_prec q[PKTQ_MAX_PREC];
 #ifdef PKTQ_LOG
-       pktq_counters_t _prec_cnt[PKTQ_MAX_PREC];               
+       pktq_counters_t _prec_cnt[PKTQ_MAX_PREC];     /* Counters per queue  */
+       pktq_counters_t _prec_bytes[PKTQ_MAX_PREC];   /* Byte count per queue  */
+       uint32 _logtime;                   /* timestamp of last counter clear  */
 #endif
 };
 
-
+/* simple, non-priority pkt queue */
 struct spktq {
        PKTQ_COMMON
-       
+       /* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */
        struct pktq_prec q[1];
 };
 
 #define PKTQ_PREC_ITER(pq, prec)        for (prec = (pq)->num_prec - 1; prec >= 0; prec--)
 
-
+/* fn(pkt, arg).  return true if pkt belongs to if */
 typedef bool (*ifpkt_cb_t)(void*, int);
 
 #ifdef BCMPKTPOOL
 #define POOL_ENAB(pool)                ((pool) && (pool)->inited)
-#if defined(BCM4329C0)
-#define SHARED_POOL            (pktpool_shared_ptr)
-#else
 #define SHARED_POOL            (pktpool_shared)
-#endif
-#else
+#else /* BCMPKTPOOL */
 #define POOL_ENAB(bus)         0
 #define SHARED_POOL            ((struct pktpool *)NULL)
-#endif
+#endif /* BCMPKTPOOL */
 
 #ifndef PKTPOOL_LEN_MAX
 #define PKTPOOL_LEN_MAX                40
-#endif 
+#endif /* PKTPOOL_LEN_MAX */
 #define PKTPOOL_CB_MAX         3
 
 struct pktpool;
@@ -172,7 +191,7 @@ typedef struct {
 } pktpool_cbinfo_t;
 
 #ifdef BCMDBG_POOL
-
+/* pkt pool debug states */
 #define POOL_IDLE      0
 #define POOL_RXFILL    1
 #define POOL_RXDH      2
@@ -189,15 +208,15 @@ typedef struct {
 } pktpool_dbg_t;
 
 typedef struct {
-       uint8 txdh;
-       uint8 txd11;
-       uint8 enq;
-       uint8 rxdh;
-       uint8 rxd11;
-       uint8 rxfill;
-       uint8 idle;
+       uint8 txdh;     /* tx to host */
+       uint8 txd11;    /* tx to d11 */
+       uint8 enq;      /* waiting in q */
+       uint8 rxdh;     /* rx from host */
+       uint8 rxd11;    /* rx from d11 */
+       uint8 rxfill;   /* dma_rxfill */
+       uint8 idle;     /* avail in pool */
 } pktpool_stats_t;
-#endif
+#endif /* BCMDBG_POOL */
 
 typedef struct pktpool {
        bool inited;
@@ -225,11 +244,7 @@ typedef struct pktpool {
 #endif
 } pktpool_t;
 
-#if defined(BCM4329C0)
-extern pktpool_t *pktpool_shared_ptr;
-#else
 extern pktpool_t *pktpool_shared;
-#endif
 
 extern int pktpool_init(osl_t *osh, pktpool_t *pktp, int *pktplen, int plen, bool istx);
 extern int pktpool_deinit(osl_t *osh, pktpool_t *pktp);
@@ -258,16 +273,16 @@ extern int pktpool_start_trigger(pktpool_t *pktp, void *p);
 extern int pktpool_dbg_dump(pktpool_t *pktp);
 extern int pktpool_dbg_notify(pktpool_t *pktp);
 extern int pktpool_stats_dump(pktpool_t *pktp, pktpool_stats_t *stats);
-#endif
-
+#endif /* BCMDBG_POOL */
 
+/* forward definition of ether_addr structure used by some function prototypes */
 
 struct ether_addr;
 
 extern int ether_isbcast(const void *ea);
 extern int ether_isnulladdr(const void *ea);
 
-
+/* operations on a specific precedence in packet queue */
 
 #define pktq_psetmax(pq, prec, _max)   ((pq)->q[prec].max = (_max))
 #define pktq_pmax(pq, prec)            ((pq)->q[prec].max)
@@ -283,20 +298,21 @@ extern void *pktq_penq(struct pktq *pq, int prec, void *p);
 extern void *pktq_penq_head(struct pktq *pq, int prec, void *p);
 extern void *pktq_pdeq(struct pktq *pq, int prec);
 extern void *pktq_pdeq_prev(struct pktq *pq, int prec, void *prev_p);
+extern void *pktq_pdeq_with_fn(struct pktq *pq, int prec, ifpkt_cb_t fn, int arg);
 extern void *pktq_pdeq_tail(struct pktq *pq, int prec);
-
+/* Empty the queue at particular precedence level */
 extern void pktq_pflush(osl_t *osh, struct pktq *pq, int prec, bool dir,
        ifpkt_cb_t fn, int arg);
-
+/* Remove a specified packet from its queue */
 extern bool pktq_pdel(struct pktq *pq, void *p, int prec);
 
-
+/* operations on a set of precedences in packet queue */
 
 extern int pktq_mlen(struct pktq *pq, uint prec_bmp);
 extern void *pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out);
 extern void *pktq_mpeek(struct pktq *pq, uint prec_bmp, int *prec_out);
 
-
+/* operations on packet queue as a whole */
 
 #define pktq_len(pq)           ((int)(pq)->len)
 #define pktq_max(pq)           ((int)(pq)->max)
@@ -304,7 +320,7 @@ extern void *pktq_mpeek(struct pktq *pq, uint prec_bmp, int *prec_out);
 #define pktq_full(pq)          ((pq)->len >= (pq)->max)
 #define pktq_empty(pq)         ((pq)->len == 0)
 
-
+/* operations for single precedence queues */
 #define pktenq(pq, p)          pktq_penq(((struct pktq *)(void *)pq), 0, (p))
 #define pktenq_head(pq, p)     pktq_penq_head(((struct pktq *)(void *)pq), 0, (p))
 #define pktdeq(pq)             pktq_pdeq(((struct pktq *)(void *)pq), 0)
@@ -314,32 +330,33 @@ extern void *pktq_mpeek(struct pktq *pq, uint prec_bmp, int *prec_out);
 extern void pktq_init(struct pktq *pq, int num_prec, int max_len);
 extern void pktq_set_max_plen(struct pktq *pq, int prec, int max_len);
 
-
+/* prec_out may be NULL if caller is not interested in return value */
 extern void *pktq_deq(struct pktq *pq, int *prec_out);
 extern void *pktq_deq_tail(struct pktq *pq, int *prec_out);
 extern void *pktq_peek(struct pktq *pq, int *prec_out);
 extern void *pktq_peek_tail(struct pktq *pq, int *prec_out);
 extern void pktq_flush(osl_t *osh, struct pktq *pq, bool dir, ifpkt_cb_t fn, int arg);
 
-
-
+/* externs */
+/* packet */
 extern uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf);
 extern uint pktfrombuf(osl_t *osh, void *p, uint offset, int len, uchar *buf);
 extern uint pkttotlen(osl_t *osh, void *p);
 extern void *pktlast(osl_t *osh, void *p);
 extern uint pktsegcnt(osl_t *osh, void *p);
 extern uint pktsegcnt_war(osl_t *osh, void *p);
-extern uint8 *pktoffset(osl_t *osh, void *p,  uint offset);
-
+extern uint8 *pktdataoffset(osl_t *osh, void *p,  uint offset);
+extern void *pktoffset(osl_t *osh, void *p,  uint offset);
 
-#define        PKTPRIO_VDSCP   0x100           
-#define        PKTPRIO_VLAN    0x200           
-#define        PKTPRIO_UPD     0x400           
-#define        PKTPRIO_DSCP    0x800           
+/* Get priority from a packet and pass it back in scb (or equiv) */
+#define        PKTPRIO_VDSCP   0x100           /* DSCP prio found after VLAN tag */
+#define        PKTPRIO_VLAN    0x200           /* VLAN prio found */
+#define        PKTPRIO_UPD     0x400           /* DSCP used to update VLAN prio */
+#define        PKTPRIO_DSCP    0x800           /* DSCP prio found */
 
 extern uint pktsetprio(void *pkt, bool update_vtag);
 
-
+/* string */
 extern int bcm_atoi(const char *s);
 extern ulong bcm_strtoul(const char *cp, char **endp, uint base);
 extern char *bcmstrstr(const char *haystack, const char *needle);
@@ -351,17 +368,17 @@ int bcmstricmp(const char *s1, const char *s2);
 int bcmstrnicmp(const char* s1, const char* s2, int cnt);
 
 
-
+/* ethernet address */
 extern char *bcm_ether_ntoa(const struct ether_addr *ea, char *buf);
 extern int bcm_ether_atoe(const char *p, struct ether_addr *ea);
 
-
+/* ip address */
 struct ipv4_addr;
 extern char *bcm_ip_ntoa(struct ipv4_addr *ia, char *buf);
 
-
+/* delay */
 extern void bcm_mdelay(uint ms);
-
+/* variable access */
 #define NVRAM_RECLAIM_CHECK(name)
 
 extern char *getvar(char *vars, const char *name);
@@ -383,52 +400,57 @@ extern uint getgpiopin(char *vars, char *pin_name, uint def_pin);
 extern char *bcm_nvram_vars(uint *length);
 extern int bcm_nvram_cache(void *sih);
 
+/* Support for sharing code across in-driver iovar implementations.
+ * The intent is that a driver use this structure to map iovar names
+ * to its (private) iovar identifiers, and the lookup function to
+ * find the entry.  Macros are provided to map ids and get/set actions
+ * into a single number space for a switch statement.
+ */
 
-
-
+/* iovar structure */
 typedef struct bcm_iovar {
-       const char *name;
-       uint16 varid;
-       uint16 flags;
-       uint16 type;
-       uint16 minlen;
+       const char *name;       /* name for lookup and display */
+       uint16 varid;           /* id for switch */
+       uint16 flags;           /* driver-specific flag bits */
+       uint16 type;            /* base type of argument */
+       uint16 minlen;          /* min length for buffer vars */
 } bcm_iovar_t;
 
+/* varid definitions are per-driver, may use these get/set bits */
 
+/* IOVar action bits for id mapping */
+#define IOV_GET 0 /* Get an iovar */
+#define IOV_SET 1 /* Set an iovar */
 
-
-#define IOV_GET 0
-#define IOV_SET 1
-
-
-#define IOV_GVAL(id)           ((id)*2)
+/* Varid to actionid mapping */
+#define IOV_GVAL(id)           ((id) * 2)
 #define IOV_SVAL(id)           ((id) * 2 + IOV_SET)
 #define IOV_ISSET(actionid)    ((actionid & IOV_SET) == IOV_SET)
 #define IOV_ID(actionid)       (actionid >> 1)
 
-
+/* flags are per-driver based on driver attributes */
 
 extern const bcm_iovar_t *bcm_iovar_lookup(const bcm_iovar_t *table, const char *name);
 extern int bcm_iovar_lencheck(const bcm_iovar_t *table, void *arg, int len, bool set);
 #if defined(WLTINYDUMP) || defined(WLMSG_INFORM) || defined(WLMSG_ASSOC) || \
        defined(WLMSG_PRPKT) || defined(WLMSG_WSEC)
 extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len);
-#endif
-#endif
-
-
-#define IOVT_VOID      0
-#define IOVT_BOOL      1
-#define IOVT_INT8      2
-#define IOVT_UINT8     3
-#define IOVT_INT16     4
-#define IOVT_UINT16    5
-#define IOVT_INT32     6
-#define IOVT_UINT32    7
-#define IOVT_BUFFER    8
+#endif 
+#endif /* BCMDRIVER */
+
+/* Base type definitions */
+#define IOVT_VOID      0       /* no value (implictly set only) */
+#define IOVT_BOOL      1       /* any value ok (zero/nonzero) */
+#define IOVT_INT8      2       /* integer values are range-checked */
+#define IOVT_UINT8     3       /* unsigned int 8 bits */
+#define IOVT_INT16     4       /* int 16 bits */
+#define IOVT_UINT16    5       /* unsigned int 16 bits */
+#define IOVT_INT32     6       /* int 32 bits */
+#define IOVT_UINT32    7       /* unsigned int 32 bits */
+#define IOVT_BUFFER    8       /* buffer is size-checked as per minlen */
 #define BCM_IOVT_VALID(type) (((unsigned int)(type)) <= IOVT_BUFFER)
 
-
+/* Initializer for IOV type strings */
 #define BCM_IOV_TYPE_INIT { \
        "void", \
        "bool", \
@@ -450,60 +472,70 @@ extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len);
        (type == IOVT_INT32) || \
        (type == IOVT_UINT32))
 
+/* ** driver/apps-shared section ** */
 
-
-#define BCME_STRLEN            64
+#define BCME_STRLEN            64      /* Max string length for BCM errors */
 #define VALID_BCMERROR(e)  ((e <= 0) && (e >= BCME_LAST))
 
 
-
-
-#define BCME_OK                                0
-#define BCME_ERROR                     -1
-#define BCME_BADARG                    -2
-#define BCME_BADOPTION                 -3
-#define BCME_NOTUP                     -4
-#define BCME_NOTDOWN                   -5
-#define BCME_NOTAP                     -6
-#define BCME_NOTSTA                    -7
-#define BCME_BADKEYIDX                 -8
-#define BCME_RADIOOFF                  -9
-#define BCME_NOTBANDLOCKED             -10
-#define BCME_NOCLK                     -11
-#define BCME_BADRATESET                        -12
-#define BCME_BADBAND                   -13
-#define BCME_BUFTOOSHORT               -14
-#define BCME_BUFTOOLONG                        -15
-#define BCME_BUSY                      -16
-#define BCME_NOTASSOCIATED             -17
-#define BCME_BADSSIDLEN                        -18
-#define BCME_OUTOFRANGECHAN            -19
-#define BCME_BADCHAN                   -20
-#define BCME_BADADDR                   -21
-#define BCME_NORESOURCE                        -22
-#define BCME_UNSUPPORTED               -23
-#define BCME_BADLEN                    -24
-#define BCME_NOTREADY                  -25
-#define BCME_EPERM                     -26
-#define BCME_NOMEM                     -27
-#define BCME_ASSOCIATED                        -28
-#define BCME_RANGE                     -29
-#define BCME_NOTFOUND                  -30
-#define BCME_WME_NOT_ENABLED           -31
-#define BCME_TSPEC_NOTFOUND            -32
-#define BCME_ACM_NOTSUPPORTED          -33
-#define BCME_NOT_WME_ASSOCIATION       -34
-#define BCME_SDIO_ERROR                        -35
-#define BCME_DONGLE_DOWN               -36
-#define BCME_VERSION                   -37
-#define BCME_TXFAIL                    -38
-#define BCME_RXFAIL                    -39
-#define BCME_NODEVICE                  -40
-#define BCME_NMODE_DISABLED            -41
-#define BCME_NONRESIDENT               -42
-#define BCME_LAST                      BCME_NONRESIDENT
-
-
+/*
+ * error codes could be added but the defined ones shouldn't be changed/deleted
+ * these error codes are exposed to the user code
+ * when ever a new error code is added to this list
+ * please update errorstring table with the related error string and
+ * update osl files with os specific errorcode map
+*/
+
+#define BCME_OK                                0       /* Success */
+#define BCME_ERROR                     -1      /* Error generic */
+#define BCME_BADARG                    -2      /* Bad Argument */
+#define BCME_BADOPTION                 -3      /* Bad option */
+#define BCME_NOTUP                     -4      /* Not up */
+#define BCME_NOTDOWN                   -5      /* Not down */
+#define BCME_NOTAP                     -6      /* Not AP */
+#define BCME_NOTSTA                    -7      /* Not STA  */
+#define BCME_BADKEYIDX                 -8      /* BAD Key Index */
+#define BCME_RADIOOFF                  -9      /* Radio Off */
+#define BCME_NOTBANDLOCKED             -10     /* Not  band locked */
+#define BCME_NOCLK                     -11     /* No Clock */
+#define BCME_BADRATESET                        -12     /* BAD Rate valueset */
+#define BCME_BADBAND                   -13     /* BAD Band */
+#define BCME_BUFTOOSHORT               -14     /* Buffer too short */
+#define BCME_BUFTOOLONG                        -15     /* Buffer too long */
+#define BCME_BUSY                      -16     /* Busy */
+#define BCME_NOTASSOCIATED             -17     /* Not Associated */
+#define BCME_BADSSIDLEN                        -18     /* Bad SSID len */
+#define BCME_OUTOFRANGECHAN            -19     /* Out of Range Channel */
+#define BCME_BADCHAN                   -20     /* Bad Channel */
+#define BCME_BADADDR                   -21     /* Bad Address */
+#define BCME_NORESOURCE                        -22     /* Not Enough Resources */
+#define BCME_UNSUPPORTED               -23     /* Unsupported */
+#define BCME_BADLEN                    -24     /* Bad length */
+#define BCME_NOTREADY                  -25     /* Not Ready */
+#define BCME_EPERM                     -26     /* Not Permitted */
+#define BCME_NOMEM                     -27     /* No Memory */
+#define BCME_ASSOCIATED                        -28     /* Associated */
+#define BCME_RANGE                     -29     /* Not In Range */
+#define BCME_NOTFOUND                  -30     /* Not Found */
+#define BCME_WME_NOT_ENABLED           -31     /* WME Not Enabled */
+#define BCME_TSPEC_NOTFOUND            -32     /* TSPEC Not Found */
+#define BCME_ACM_NOTSUPPORTED          -33     /* ACM Not Supported */
+#define BCME_NOT_WME_ASSOCIATION       -34     /* Not WME Association */
+#define BCME_SDIO_ERROR                        -35     /* SDIO Bus Error */
+#define BCME_DONGLE_DOWN               -36     /* Dongle Not Accessible */
+#define BCME_VERSION                   -37     /* Incorrect version */
+#define BCME_TXFAIL                    -38     /* TX failure */
+#define BCME_RXFAIL                    -39     /* RX failure */
+#define BCME_NODEVICE                  -40     /* Device not present */
+#define BCME_NMODE_DISABLED            -41     /* NMODE disabled */
+#define BCME_NONRESIDENT               -42 /* access to nonresident overlay */
+#define BCME_SCANREJECT                        -43     /* reject scan request */
+#define BCME_USAGE_ERROR                -44     /* WLCMD usage error */
+#define BCME_IOCTL_ERROR                -45     /* WLCMD ioctl error */
+#define BCME_SERIAL_PORT_ERR            -46     /* RWL serial port error */
+#define BCME_LAST                      BCME_SERIAL_PORT_ERR
+
+/* These are collection of BCME Error strings */
 #define BCMERRSTRINGTABLE {            \
        "OK",                           \
        "Undefined error",              \
@@ -548,23 +580,45 @@ extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len);
        "Device Not Present",           \
        "NMODE Disabled",               \
        "Nonresident overlay access", \
+       "Scan Rejected",                \
+       "WLCMD usage error",            \
+       "WLCMD ioctl error",            \
+       "RWL serial port error",        \
 }
 
 #ifndef ABS
-#define        ABS(a)                  (((a) < 0)?-(a):(a))
-#endif
+#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 CEIL(x, y)             (((x) + ((y)-1)) / (y))
-#define        ROUNDUP(x, y)           ((((x)+((y)-1))/(y))*(y))
-#define        ISALIGNED(a, x)         (((uintptr)(a) & ((x)-1)) == 0)
+#define        MAX(a, b)               (((a) > (b)) ? (a) : (b))
+#endif /* MAX */
+
+/* limit to [min, max] */
+#ifndef LIMIT_TO_RANGE
+#define LIMIT_TO_RANGE(x, min, max) \
+       ((x) < (min) ? (min) : ((x) > (max) ? (max) : (x)))
+#endif /* LIMIT_TO_RANGE */
+
+/* limit to  max */
+#ifndef LIMIT_TO_MAX
+#define LIMIT_TO_MAX(x, max) \
+       (((x) > (max) ? (max) : (x)))
+#endif /* LIMIT_TO_MAX */
+
+/* limit to min */
+#ifndef LIMIT_TO_MIN
+#define LIMIT_TO_MIN(x, min) \
+       (((x) < (min) ? (min) : (x)))
+#endif /* LIMIT_TO_MIN */
+
+#define CEIL(x, y)             (((x) + ((y) - 1)) / (y))
+#define        ROUNDUP(x, y)           ((((x) + ((y) - 1)) / (y)) * (y))
+#define        ISALIGNED(a, x)         (((uintptr)(a) & ((x) - 1)) == 0)
 #define ALIGN_ADDR(addr, boundary) (void *)(((uintptr)(addr) + (boundary) - 1) \
                                                 & ~((boundary) - 1))
 #define ALIGN_SIZE(size, boundary) (((size) + (boundary) - 1) \
@@ -574,32 +628,49 @@ extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len);
 
 #ifndef OFFSETOF
 #ifdef __ARMCC_VERSION
-
+/*
+ * The ARM RVCT compiler complains when using OFFSETOF where a constant
+ * expression is expected, such as an initializer for a static object.
+ * offsetof from the runtime library doesn't have that problem.
+ */
 #include <stddef.h>
 #define        OFFSETOF(type, member)  offsetof(type, member)
 #else
 #define        OFFSETOF(type, member)  ((uint)(uintptr)&((type *)0)->member)
-#endif 
-#endif 
+#endif /* __ARMCC_VERSION */
+#endif /* OFFSETOF */
 
 #ifndef ARRAYSIZE
-#define ARRAYSIZE(a)           (sizeof(a)/sizeof(a[0]))
+#define ARRAYSIZE(a)           (sizeof(a) / sizeof(a[0]))
 #endif
 
+#ifndef ARRAYLAST     /* returns pointer to last array element */
+#define ARRAYLAST(a)           (&a[ARRAYSIZE(a)-1])
+#endif
 
+/* Reference a function; used to prevent a static function from being optimized out */
 extern void *_bcmutils_dummy_fn;
 #define REFERENCE_FUNCTION(f)  (_bcmutils_dummy_fn = (void *)(f))
 
-
+/* bit map related macros */
 #ifndef setbit
-#ifndef NBBY
-#define        NBBY    8
-#endif
-#define        setbit(a, i)    (((uint8 *)a)[(i)/NBBY] |= 1<<((i)%NBBY))
-#define        clrbit(a, i)    (((uint8 *)a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
-#define        isset(a, i)     (((const uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY)))
-#define        isclr(a, i)     ((((const uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
+#ifndef NBBY               /* the BSD family defines NBBY */
+#define        NBBY    8       /* 8 bits per byte */
+#endif /* #ifndef NBBY */
+#ifdef BCMUTILS_BIT_MACROS_USE_FUNCS
+extern void setbit(void *array, uint bit);
+extern void clrbit(void *array, uint bit);
+extern bool isset(const void *array, uint bit);
+extern bool isclr(const void *array, uint bit);
+#else
+#define        setbit(a, i)    (((uint8 *)a)[(i) / NBBY] |= 1 << ((i) % NBBY))
+#define        clrbit(a, i)    (((uint8 *)a)[(i) / NBBY] &= ~(1 << ((i) % NBBY)))
+#define        isset(a, i)     (((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY)))
+#define        isclr(a, i)     ((((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY))) == 0)
 #endif
+#endif /* setbit */
+
+#define        isbitset(a, i)  (((a) & (1 << (i))) != 0)
 
 #define        NBITS(type)     (sizeof(type) * 8)
 #define NBITVAL(nbits) (1 << (nbits))
@@ -607,36 +678,36 @@ extern void *_bcmutils_dummy_fn;
 #define        NBITMASK(nbits) MAXBITVAL(nbits)
 #define MAXNBVAL(nbyte)        MAXBITVAL((nbyte) * 8)
 
-
+/* basic mux operation - can be optimized on several architectures */
 #define MUX(pred, true, false) ((pred) ? (true) : (false))
 
-
+/* modulo inc/dec - assumes x E [0, bound - 1] */
 #define MODDEC(x, bound) MUX((x) == 0, (bound) - 1, (x) - 1)
 #define MODINC(x, bound) MUX((x) == (bound) - 1, 0, (x) + 1)
 
-
+/* modulo inc/dec, bound = 2^k */
 #define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1))
 #define MODINC_POW2(x, bound) (((x) + 1) & ((bound) - 1))
 
-
+/* modulo add/sub - assumes x, y E [0, bound - 1] */
 #define MODADD(x, y, bound) \
     MUX((x) + (y) >= (bound), (x) + (y) - (bound), (x) + (y))
 #define MODSUB(x, y, bound) \
     MUX(((int)(x)) - ((int)(y)) < 0, (x) - (y) + (bound), (x) - (y))
 
-
+/* module add/sub, bound = 2^k */
 #define MODADD_POW2(x, y, bound) (((x) + (y)) & ((bound) - 1))
 #define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1))
 
+/* crc defines */
+#define CRC8_INIT_VALUE  0xff          /* Initial CRC8 checksum value */
+#define CRC8_GOOD_VALUE  0x9f          /* Good final CRC8 checksum value */
+#define CRC16_INIT_VALUE 0xffff                /* Initial CRC16 checksum value */
+#define CRC16_GOOD_VALUE 0xf0b8                /* Good final CRC16 checksum value */
+#define CRC32_INIT_VALUE 0xffffffff    /* Initial CRC32 checksum value */
+#define CRC32_GOOD_VALUE 0xdebb20e3    /* Good final CRC32 checksum value */
 
-#define CRC8_INIT_VALUE  0xff
-#define CRC8_GOOD_VALUE  0x9f
-#define CRC16_INIT_VALUE 0xffff
-#define CRC16_GOOD_VALUE 0xf0b8
-#define CRC32_INIT_VALUE 0xffffffff
-#define CRC32_GOOD_VALUE 0xdebb20e3
-
-
+/* use for direct output of MAC address in printf etc */
 #define MACF                           "%02x:%02x:%02x:%02x:%02x:%02x"
 #define ETHERP_TO_MACF(ea)     ((struct ether_addr *) (ea))->octet[0], \
                                                        ((struct ether_addr *) (ea))->octet[1], \
@@ -651,27 +722,42 @@ extern void *_bcmutils_dummy_fn;
                                                        (ea).octet[3], \
                                                        (ea).octet[4], \
                                                        (ea).octet[5]
+#if !defined(SIMPLE_MAC_PRINT)
+#define MACDBG "%02x:%02x:%02x:%02x:%02x:%02x"
+#define MAC2STRDBG(ea) (ea)[0], (ea)[1], (ea)[2], (ea)[3], (ea)[4], (ea)[5]
+#else
+#define MACDBG                         "%02x:%02x:%02x"
+#define MAC2STRDBG(ea) (ea)[0], (ea)[4], (ea)[5]
+#endif /* SIMPLE_MAC_PRINT */
 
+/* bcm_format_flags() bit description structure */
 typedef struct bcm_bit_desc {
        uint32  bit;
        const char* name;
 } bcm_bit_desc_t;
 
+/* bcm_format_field */
+typedef struct bcm_bit_desc_ex {
+       uint32 mask;
+       const bcm_bit_desc_t *bitfield;
+} bcm_bit_desc_ex_t;
 
+
+/* tag_ID/length/value_buffer tuple */
 typedef struct bcm_tlv {
        uint8   id;
        uint8   len;
        uint8   data[1];
 } bcm_tlv_t;
 
-
+/* Check that bcm_tlv_t fits into the given buflen */
 #define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len))
 
+/* buffer length for ethernet address from bcm_ether_ntoa() */
+#define ETHER_ADDR_STR_LEN     18      /* 18-bytes of Ethernet address buffer length */
 
-#define ETHER_ADDR_STR_LEN     18
-
-
-
+/* crypto utility function */
+/* 128-bit xor: *dst = *src1 xor *src2. dst1, src1 and src2 may have any alignment */
 static INLINE void
 xor_128bit_block(const uint8 *src1, const uint8 *src2, uint8 *dst)
 {
@@ -680,28 +766,32 @@ xor_128bit_block(const uint8 *src1, const uint8 *src2, uint8 *dst)
            1 ||
 #endif
            (((uintptr)src1 | (uintptr)src2 | (uintptr)dst) & 3) == 0) {
-
-
+               /* ARM CM3 rel time: 1229 (727 if alignment check could be omitted) */
+               /* x86 supports unaligned.  This version runs 6x-9x faster on x86. */
                ((uint32 *)dst)[0] = ((const uint32 *)src1)[0] ^ ((const uint32 *)src2)[0];
                ((uint32 *)dst)[1] = ((const uint32 *)src1)[1] ^ ((const uint32 *)src2)[1];
                ((uint32 *)dst)[2] = ((const uint32 *)src1)[2] ^ ((const uint32 *)src2)[2];
                ((uint32 *)dst)[3] = ((const uint32 *)src1)[3] ^ ((const uint32 *)src2)[3];
        } else {
-
+               /* ARM CM3 rel time: 4668 (4191 if alignment check could be omitted) */
                int k;
                for (k = 0; k < 16; k++)
                        dst[k] = src1[k] ^ src2[k];
        }
 }
 
-
-
+/* externs */
+/* crc */
 extern uint8 hndcrc8(uint8 *p, uint nbytes, uint8 crc);
 extern uint16 hndcrc16(uint8 *p, uint nbytes, uint16 crc);
 extern uint32 hndcrc32(uint8 *p, uint nbytes, uint32 crc);
 
+/* format/print */
 #if defined(DHD_DEBUG) || defined(WLMSG_PRHDRS) || defined(WLMSG_PRPKT) || \
        defined(WLMSG_ASSOC)
+/* print out the value a field has: fields may have 1-32 bits and may hold any value */
+extern int bcm_format_field(const bcm_bit_desc_ex_t *bd, uint32 field, char* buf, int len);
+/* print out which bits in flags are set */
 extern int bcm_format_flags(const bcm_bit_desc_t *bd, uint32 flags, char* buf, int len);
 #endif
 
@@ -716,23 +806,23 @@ extern char *bcm_brev_str(uint32 brev, char *buf);
 extern void printbig(char *buf);
 extern void prhex(const char *msg, uchar *buf, uint len);
 
-
+/* IE parsing */
 extern bcm_tlv_t *bcm_next_tlv(bcm_tlv_t *elt, int *buflen);
 extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key);
 extern bcm_tlv_t *bcm_parse_ordered_tlvs(void *buf, int buflen, uint key);
 
-
+/* bcmerror */
 extern const char *bcmerrorstr(int bcmerror);
-extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key);
-
+/* extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key); */
 
+/* multi-bool data type: set of bools, mbool is true if any is set */
 typedef uint32 mbool;
-#define mboolset(mb, bit)              ((mb) |= (bit))         
-#define mboolclr(mb, bit)              ((mb) &= ~(bit))        
-#define mboolisset(mb, bit)            (((mb) & (bit)) != 0)   
+#define mboolset(mb, bit)              ((mb) |= (bit))         /* set one bool */
+#define mboolclr(mb, bit)              ((mb) &= ~(bit))        /* clear one bool */
+#define mboolisset(mb, bit)            (((mb) & (bit)) != 0)   /* TRUE if one bool is set */
 #define        mboolmaskset(mb, mask, val)     ((mb) = (((mb) & ~(mask)) | (val)))
 
-
+/* generic datastruct to help dump routines */
 struct fielddesc {
        const char *nameandfmt;
        uint32  offset;
@@ -753,15 +843,22 @@ extern uint bcm_bitcount(uint8 *bitmap, uint bytelength);
 
 extern int bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...);
 
-
+/* power conversion */
 extern uint16 bcm_qdbm_to_mw(uint8 qdbm);
 extern uint8 bcm_mw_to_qdbm(uint16 mw);
 extern uint bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint len);
 
 unsigned int process_nvram_vars(char *varbuf, unsigned int len);
+extern bcm_tlv_t *find_vendor_ie(void *tlvs, int tlvs_len,
+       const char *voui, uint8 *type, int type_len);
+
+/* calculate a * b + c */
+extern void bcm_uint64_multiple_add(uint32* r_high, uint32* r_low, uint32 a, uint32 b, uint32 c);
+/* calculate a / b */
+extern void bcm_uint64_divide(uint32* r, uint32 a_high, uint32 a_low, uint32 b);
 
 #ifdef __cplusplus
        }
 #endif
 
-#endif
+#endif /* _bcmutils_h_ */
diff --git a/bcmdhd/dhdutil/include/bcmwifi.h b/bcmdhd/dhdutil/include/bcmwifi.h
deleted file mode 100644 (file)
index 47c67a5..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Misc utility routines for WL and Apps
- * This header file housing the define and function prototype use by
- * both the wl driver, tools & Apps.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: bcmwifi.h,v 1.29.6.3 2010-08-03 17:47:04 Exp $
- */
-
-
-#ifndef        _bcmwifi_h_
-#define        _bcmwifi_h_
-
-
-
-typedef uint16 chanspec_t;
-
-
-#define CH_UPPER_SB                    0x01
-#define CH_LOWER_SB                    0x02
-#define CH_EWA_VALID                   0x04
-#define CH_20MHZ_APART                 4
-#define CH_10MHZ_APART                 2
-#define CH_5MHZ_APART                  1
-#define CH_MAX_2G_CHANNEL              14
-#define WLC_MAX_2G_CHANNEL             CH_MAX_2G_CHANNEL
-#define        MAXCHANNEL              224
-
-#define WL_CHANSPEC_CHAN_MASK          0x00ff
-#define WL_CHANSPEC_CHAN_SHIFT         0
-
-#define WL_CHANSPEC_CTL_SB_MASK                0x0300
-#define WL_CHANSPEC_CTL_SB_SHIFT            8
-#define WL_CHANSPEC_CTL_SB_LOWER       0x0100
-#define WL_CHANSPEC_CTL_SB_UPPER       0x0200
-#define WL_CHANSPEC_CTL_SB_NONE                0x0300
-
-#define WL_CHANSPEC_BW_MASK            0x0C00
-#define WL_CHANSPEC_BW_SHIFT               10
-#define WL_CHANSPEC_BW_10              0x0400
-#define WL_CHANSPEC_BW_20              0x0800
-#define WL_CHANSPEC_BW_40              0x0C00
-
-#define WL_CHANSPEC_BAND_MASK          0xf000
-#define WL_CHANSPEC_BAND_SHIFT         12
-#define WL_CHANSPEC_BAND_5G            0x1000
-#define WL_CHANSPEC_BAND_2G            0x2000
-#define INVCHANSPEC                    255
-
-
-#define WF_CHAN_FACTOR_2_4_G           4814
-#define WF_CHAN_FACTOR_5_G             10000
-#define WF_CHAN_FACTOR_4_G             8000
-
-
-#define LOWER_20_SB(channel)   (((channel) > CH_10MHZ_APART) ? ((channel) - CH_10MHZ_APART) : 0)
-#define UPPER_20_SB(channel)   (((channel) < (MAXCHANNEL - CH_10MHZ_APART)) ? \
-                               ((channel) + CH_10MHZ_APART) : 0)
-#define CHSPEC_WLCBANDUNIT(chspec)     (CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX)
-#define CH20MHZ_CHSPEC(channel)        (chanspec_t)((chanspec_t)(channel) | WL_CHANSPEC_BW_20 | \
-                               WL_CHANSPEC_CTL_SB_NONE | (((channel) <= CH_MAX_2G_CHANNEL) ? \
-                               WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G))
-#define NEXT_20MHZ_CHAN(channel)       (((channel) < (MAXCHANNEL - CH_20MHZ_APART)) ? \
-                                       ((channel) + CH_20MHZ_APART) : 0)
-#define CH40MHZ_CHSPEC(channel, ctlsb) (chanspec_t) \
-                                       ((channel) | (ctlsb) | WL_CHANSPEC_BW_40 | \
-                                       ((channel) <= CH_MAX_2G_CHANNEL ? WL_CHANSPEC_BAND_2G : \
-                                       WL_CHANSPEC_BAND_5G))
-#define CHSPEC_CHANNEL(chspec) ((uint8)((chspec) & WL_CHANSPEC_CHAN_MASK))
-#define CHSPEC_BAND(chspec)    ((chspec) & WL_CHANSPEC_BAND_MASK)
-
-
-#define CHSPEC_CTL_SB(chspec)  (chspec & WL_CHANSPEC_CTL_SB_MASK)
-#define CHSPEC_BW(chspec)      (chspec & WL_CHANSPEC_BW_MASK)
-
-#ifdef WL11N_20MHZONLY
-
-#define CHSPEC_IS10(chspec)    0
-#define CHSPEC_IS20(chspec)    1
-#ifndef CHSPEC_IS40
-#define CHSPEC_IS40(chspec)    0
-#endif
-
-#else
-
-#define CHSPEC_IS10(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10)
-#define CHSPEC_IS20(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20)
-#ifndef CHSPEC_IS40
-#define CHSPEC_IS40(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40)
-#endif
-
-#endif
-
-#define CHSPEC_IS20_UNCOND(chspec)     (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20)
-
-#define CHSPEC_IS5G(chspec)    (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G)
-#define CHSPEC_IS2G(chspec)    (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G)
-#define CHSPEC_SB_NONE(chspec) (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_NONE)
-#define CHSPEC_SB_UPPER(chspec)        (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_UPPER)
-#define CHSPEC_SB_LOWER(chspec)        (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_LOWER)
-#define CHSPEC_CTL_CHAN(chspec)  ((CHSPEC_SB_LOWER(chspec)) ? \
-                                 (LOWER_20_SB(((chspec) & WL_CHANSPEC_CHAN_MASK))) : \
-                                 (UPPER_20_SB(((chspec) & WL_CHANSPEC_CHAN_MASK))))
-#define CHSPEC2WLC_BAND(chspec) (CHSPEC_IS5G(chspec) ? WLC_BAND_5G : WLC_BAND_2G)
-
-#define CHANSPEC_STR_LEN    8
-
-
-#define WLC_MAXRATE    108
-#define WLC_RATE_1M    2
-#define WLC_RATE_2M    4
-#define WLC_RATE_5M5   11
-#define WLC_RATE_11M   22
-#define WLC_RATE_6M    12
-#define WLC_RATE_9M    18
-#define WLC_RATE_12M   24
-#define WLC_RATE_18M   36
-#define WLC_RATE_24M   48
-#define WLC_RATE_36M   72
-#define WLC_RATE_48M   96
-#define WLC_RATE_54M   108
-
-#define WLC_2G_25MHZ_OFFSET            5
-
-
-extern char * wf_chspec_ntoa(chanspec_t chspec, char *buf);
-
-
-extern chanspec_t wf_chspec_aton(char *a);
-
-
-extern bool wf_chspec_malformed(chanspec_t chanspec);
-
-
-extern uint8 wf_chspec_ctlchan(chanspec_t chspec);
-
-
-extern chanspec_t wf_chspec_ctlchspec(chanspec_t chspec);
-
-
-extern int wf_mhz2channel(uint freq, uint start_factor);
-
-
-extern int wf_channel2mhz(uint channel, uint start_factor);
-
-#endif
index 3e46584..b2775b8 100644 (file)
@@ -3,7 +3,7 @@
  * This header file housing the define and function prototype use by
  * both the wl driver, tools & Apps.
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  * 
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
 #define        _bcmwifi_channels_h_
 
 
-
+/* A chanspec holds the channel number, band, bandwidth and control sideband */
 typedef uint16 chanspec_t;
 
-
+/* channel defines */
 #define CH_UPPER_SB                    0x01
 #define CH_LOWER_SB                    0x02
 #define CH_EWA_VALID                   0x04
@@ -35,12 +35,16 @@ typedef uint16 chanspec_t;
 #define CH_40MHZ_APART                 8
 #define CH_20MHZ_APART                 4
 #define CH_10MHZ_APART                 2
-#define CH_5MHZ_APART                  1       
-#define CH_MAX_2G_CHANNEL              14      
-#define        MAXCHANNEL              224     
-#define CHSPEC_CTLOVLP(sp1, sp2, sep)  ABS(wf_chspec_ctlchan(sp1) - wf_chspec_ctlchan(sp2)) < (sep)
-
-
+#define CH_5MHZ_APART                  1       /* 2G band channels are 5 Mhz apart */
+#define CH_MAX_2G_CHANNEL              14      /* Max channel in 2G band */
+#define        MAXCHANNEL              224     /* max # supported channels. The max channel no is 216,
+                                        * this is that + 1 rounded up to a multiple of NBBY (8).
+                                        * DO NOT MAKE it > 255: channels are uint8's all over
+                                        */
+#define CHSPEC_CTLOVLP(sp1, sp2, sep)  (ABS(wf_chspec_ctlchan(sp1) - wf_chspec_ctlchan(sp2)) < \
+                                 (sep))
+
+/* All builds use the new 11ac ratespec/chanspec */
 #undef  D11AC_IOTYPES
 #define D11AC_IOTYPES
 
@@ -63,14 +67,27 @@ typedef uint16 chanspec_t;
 
 #define WL_CHANSPEC_BAND_MASK          0xf000
 #define WL_CHANSPEC_BAND_SHIFT         12
+#ifdef WL_CHANSPEC_BAND_5G
+#undef WL_CHANSPEC_BAND_5G
+#endif
+#ifdef WL_CHANSPEC_BAND_2G
+#undef WL_CHANSPEC_BAND_2G
+#endif
 #define WL_CHANSPEC_BAND_5G            0x1000
 #define WL_CHANSPEC_BAND_2G            0x2000
 #define INVCHANSPEC                    255
 
-
+/* channel defines */
 #define LOWER_20_SB(channel)   (((channel) > CH_10MHZ_APART) ? ((channel) - CH_10MHZ_APART) : 0)
 #define UPPER_20_SB(channel)   (((channel) < (MAXCHANNEL - CH_10MHZ_APART)) ? \
                                ((channel) + CH_10MHZ_APART) : 0)
+
+#define LL_20_SB(channel) (((channel) > 3 * CH_10MHZ_APART) ? ((channel) - 3 * CH_10MHZ_APART) : 0)
+#define UU_20_SB(channel)      (((channel) < (MAXCHANNEL - 3 * CH_10MHZ_APART)) ? \
+                               ((channel) + 3 * CH_10MHZ_APART) : 0)
+#define LU_20_SB(channel) LOWER_20_SB(channel)
+#define UL_20_SB(channel) UPPER_20_SB(channel)
+
 #define CHSPEC_WLCBANDUNIT(chspec)     (CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX)
 #define CH20MHZ_CHSPEC(channel)        (chanspec_t)((chanspec_t)(channel) | WL_CHANSPEC_BW_20 | \
                                WL_CHANSPEC_CTL_SB_NONE | (((channel) <= CH_MAX_2G_CHANNEL) ? \
@@ -84,7 +101,7 @@ typedef uint16 chanspec_t;
 #define CHSPEC_CHANNEL(chspec) ((uint8)((chspec) & WL_CHANSPEC_CHAN_MASK))
 #define CHSPEC_BAND(chspec)    ((chspec) & WL_CHANSPEC_BAND_MASK)
 
-
+/* chanspec stores radio channel & flags to indicate control channel location, i.e. upper/lower */
 #define CHSPEC_CTL_SB(chspec)  ((chspec) & WL_CHANSPEC_CTL_SB_MASK)
 #define CHSPEC_BW(chspec)      ((chspec) & WL_CHANSPEC_BW_MASK)
 
@@ -96,7 +113,7 @@ typedef uint16 chanspec_t;
 #define CHSPEC_IS40(chspec)    0
 #endif
 
-#else 
+#else /* !WL11N_20MHZONLY */
 
 #define CHSPEC_IS10(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10)
 #define CHSPEC_IS20(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20)
@@ -104,7 +121,7 @@ typedef uint16 chanspec_t;
 #define CHSPEC_IS40(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40)
 #endif
 
-#endif 
+#endif /* !WL11N_20MHZONLY */
 
 #define CHSPEC_IS5G(chspec)    (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G)
 #define CHSPEC_IS2G(chspec)    (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G)
@@ -118,7 +135,7 @@ typedef uint16 chanspec_t;
 
 #define CHANSPEC_STR_LEN    8
 
-#else 
+#else /* D11AC_IOTYPES */
 
 #define WL_CHANSPEC_CHAN_MASK          0x00ff
 #define WL_CHANSPEC_CHAN_SHIFT         0
@@ -164,11 +181,18 @@ typedef uint16 chanspec_t;
 #define WL_CHANSPEC_BAND_5G            0xc000
 #define INVCHANSPEC                    255
 
-
+/* channel defines */
 #define LOWER_20_SB(channel)           (((channel) > CH_10MHZ_APART) ? \
                                        ((channel) - CH_10MHZ_APART) : 0)
 #define UPPER_20_SB(channel)           (((channel) < (MAXCHANNEL - CH_10MHZ_APART)) ? \
                                        ((channel) + CH_10MHZ_APART) : 0)
+
+#define LL_20_SB(channel) (((channel) > 3 * CH_10MHZ_APART) ? ((channel) - 3 * CH_10MHZ_APART) : 0)
+#define UU_20_SB(channel)      (((channel) < (MAXCHANNEL - 3 * CH_10MHZ_APART)) ? \
+                               ((channel) + 3 * CH_10MHZ_APART) : 0)
+#define LU_20_SB(channel) LOWER_20_SB(channel)
+#define UL_20_SB(channel) UPPER_20_SB(channel)
+
 #define LOWER_40_SB(channel)           ((channel) - CH_20MHZ_APART)
 #define UPPER_40_SB(channel)           ((channel) + CH_20MHZ_APART)
 #define CHSPEC_WLCBANDUNIT(chspec)     (CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX)
@@ -188,7 +212,7 @@ typedef uint16 chanspec_t;
                                        ((channel) | (ctlsb) | \
                                         WL_CHANSPEC_BW_160 | WL_CHANSPEC_BAND_5G)
 
-
+/* simple MACROs to get different fields of chanspec */
 #define CHSPEC_CHANNEL(chspec)         ((uint8)((chspec) & WL_CHANSPEC_CHAN_MASK))
 #define CHSPEC_CHAN1(chspec)           ((chspec) & WL_CHANSPEC_CHAN1_MASK)
 #define CHSPEC_CHAN2(chspec)           ((chspec) & WL_CHANSPEC_CHAN2_MASK)
@@ -213,7 +237,7 @@ typedef uint16 chanspec_t;
 #define CHSPEC_IS8080(chspec)  0
 #endif
 
-#else 
+#else /* !WL11N_20MHZONLY */
 
 #define CHSPEC_IS10(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10)
 #define CHSPEC_IS20(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20)
@@ -230,7 +254,7 @@ typedef uint16 chanspec_t;
 #define CHSPEC_IS8080(chspec)  (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_8080)
 #endif
 
-#endif 
+#endif /* !WL11N_20MHZONLY */
 
 #define CHSPEC_IS5G(chspec)    (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G)
 #define CHSPEC_IS2G(chspec)    (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G)
@@ -242,11 +266,15 @@ typedef uint16 chanspec_t;
        (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40))
 #define CHSPEC2WLC_BAND(chspec) (CHSPEC_IS5G(chspec) ? WLC_BAND_5G : WLC_BAND_2G)
 
-
+/**
+ * Number of chars needed for wf_chspec_ntoa() destination character buffer.
+ */
 #define CHANSPEC_STR_LEN    20
 
 
-
+/* Legacy Chanspec defines
+ * These are the defines for the previous format of the chanspec_t
+ */
 #define WL_LCHANSPEC_CHAN_MASK         0x00ff
 #define WL_LCHANSPEC_CHAN_SHIFT                     0
 
@@ -279,61 +307,182 @@ typedef uint16 chanspec_t;
 
 #define LCHSPEC_CREATE(chan, band, bw, sb)  ((uint16)((chan) | (sb) | (bw) | (band)))
 
-#endif 
-
-
-
+#endif /* D11AC_IOTYPES */
 
-#define WF_CHAN_FACTOR_2_4_G           4814    
-
-
-#define WF_CHAN_FACTOR_5_G             10000   
-
-
-#define WF_CHAN_FACTOR_4_G             8000    
+/*
+ * WF_CHAN_FACTOR_* constants are used to calculate channel frequency
+ * given a channel number.
+ * chan_freq = chan_factor * 500Mhz + chan_number * 5
+ */
 
+/**
+ * Channel Factor for the starting frequence of 2.4 GHz channels.
+ * The value corresponds to 2407 MHz.
+ */
+#define WF_CHAN_FACTOR_2_4_G           4814    /* 2.4 GHz band, 2407 MHz */
 
-#define WLC_MAXRATE    108     
-#define WLC_RATE_1M    2       
-#define WLC_RATE_2M    4       
-#define WLC_RATE_5M5   11      
-#define WLC_RATE_11M   22      
-#define WLC_RATE_6M    12      
-#define WLC_RATE_9M    18      
-#define WLC_RATE_12M   24      
-#define WLC_RATE_18M   36      
-#define WLC_RATE_24M   48      
-#define WLC_RATE_36M   72      
-#define WLC_RATE_48M   96      
-#define WLC_RATE_54M   108     
+/**
+ * Channel Factor for the starting frequence of 5 GHz channels.
+ * The value corresponds to 5000 MHz.
+ */
+#define WF_CHAN_FACTOR_5_G             10000   /* 5   GHz band, 5000 MHz */
 
-#define WLC_2G_25MHZ_OFFSET            5       
+/**
+ * Channel Factor for the starting frequence of 4.9 GHz channels.
+ * The value corresponds to 4000 MHz.
+ */
+#define WF_CHAN_FACTOR_4_G             8000    /* 4.9 GHz band for Japan */
 
+#define WLC_2G_25MHZ_OFFSET            5       /* 2.4GHz band channel offset */
 
+/**
+ * Convert chanspec to ascii string
+ *
+ * @param      chspec          chanspec format
+ * @param      buf             ascii string of chanspec
+ *
+ * @return     pointer to buf with room for at least CHANSPEC_STR_LEN bytes
+ *
+ * @see                CHANSPEC_STR_LEN
+ */
 extern char * wf_chspec_ntoa(chanspec_t chspec, char *buf);
 
-
+/**
+ * Convert ascii string to chanspec
+ *
+ * @param      a     pointer to input string
+ *
+ * @return     >= 0 if successful or 0 otherwise
+ */
 extern chanspec_t wf_chspec_aton(const char *a);
 
-
+/**
+ * Verify the chanspec fields are valid.
+ *
+ * Verify the chanspec is using a legal set field values, i.e. that the chanspec
+ * specified a band, bw, ctl_sb and channel and that the combination could be
+ * legal given some set of circumstances.
+ *
+ * @param      chanspec   input chanspec to verify
+ *
+ * @return TRUE if the chanspec is malformed, FALSE if it looks good.
+ */
 extern bool wf_chspec_malformed(chanspec_t chanspec);
 
-
+/**
+ * Verify the chanspec specifies a valid channel according to 802.11.
+ *
+ * @param      chanspec   input chanspec to verify
+ *
+ * @return TRUE if the chanspec is a valid 802.11 channel
+ */
 extern bool wf_chspec_valid(chanspec_t chanspec);
 
-
+/**
+ * Return the primary (control) channel.
+ *
+ * This function returns the channel number of the primary 20MHz channel. For
+ * 20MHz channels this is just the channel number. For 40MHz or wider channels
+ * it is the primary 20MHz channel specified by the chanspec.
+ *
+ * @param      chspec    input chanspec
+ *
+ * @return Returns the channel number of the primary 20MHz channel
+ */
 extern uint8 wf_chspec_ctlchan(chanspec_t chspec);
 
-
+/**
+ * Return the primary (control) chanspec.
+ *
+ * This function returns the chanspec of the primary 20MHz channel. For 20MHz
+ * channels this is just the chanspec. For 40MHz or wider channels it is the
+ * chanspec of the primary 20MHZ channel specified by the chanspec.
+ *
+ * @param      chspec    input chanspec
+ *
+ * @return Returns the chanspec of the primary 20MHz channel
+ */
 extern chanspec_t wf_chspec_ctlchspec(chanspec_t chspec);
 
-
+/**
+ * Return a channel number corresponding to a frequency.
+ *
+ * This function returns the chanspec for the primary 40MHz of an 80MHz channel.
+ * The control sideband specifies the same 20MHz channel that the 80MHz channel is using
+ * as the primary 20MHz channel.
+ */
 extern chanspec_t wf_chspec_primary40_chspec(chanspec_t chspec);
 
-
+/*
+ * Return the channel number for a given frequency and base frequency.
+ * The returned channel number is relative to the given base frequency.
+ * If the given base frequency is zero, a base frequency of 5 GHz is assumed for
+ * frequencies from 5 - 6 GHz, and 2.407 GHz is assumed for 2.4 - 2.5 GHz.
+ *
+ * Frequency is specified in MHz.
+ * The base frequency is specified as (start_factor * 500 kHz).
+ * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_5_G are defined for
+ * 2.4 GHz and 5 GHz bands.
+ *
+ * The returned channel will be in the range [1, 14] in the 2.4 GHz band
+ * and [0, 200] otherwise.
+ * -1 is returned if the start_factor is WF_CHAN_FACTOR_2_4_G and the
+ * frequency is not a 2.4 GHz channel, or if the frequency is not and even
+ * multiple of 5 MHz from the base frequency to the base plus 1 GHz.
+ *
+ * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2
+ *
+ * @param      freq          frequency in MHz
+ * @param      start_factor  base frequency in 500 kHz units, e.g. 10000 for 5 GHz
+ *
+ * @return Returns a channel number
+ *
+ * @see  WF_CHAN_FACTOR_2_4_G
+ * @see  WF_CHAN_FACTOR_5_G
+ */
 extern int wf_mhz2channel(uint freq, uint start_factor);
 
-
+/**
+ * Return the center frequency in MHz of the given channel and base frequency.
+ *
+ * Return the center frequency in MHz of the given channel and base frequency.
+ * The channel number is interpreted relative to the given base frequency.
+ *
+ * The valid channel range is [1, 14] in the 2.4 GHz band and [0, 200] otherwise.
+ * The base frequency is specified as (start_factor * 500 kHz).
+ * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_5_G are defined for
+ * 2.4 GHz and 5 GHz bands.
+ * The channel range of [1, 14] is only checked for a start_factor of
+ * WF_CHAN_FACTOR_2_4_G (4814).
+ * Odd start_factors produce channels on .5 MHz boundaries, in which case
+ * the answer is rounded down to an integral MHz.
+ * -1 is returned for an out of range channel.
+ *
+ * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2
+ *
+ * @param      channel       input channel number
+ * @param      start_factor  base frequency in 500 kHz units, e.g. 10000 for 5 GHz
+ *
+ * @return Returns a frequency in MHz
+ *
+ * @see  WF_CHAN_FACTOR_2_4_G
+ * @see  WF_CHAN_FACTOR_5_G
+ */
 extern int wf_channel2mhz(uint channel, uint start_factor);
 
-#endif 
+/**
+ * Convert ctl chan and bw to chanspec
+ *
+ * @param      ctl_ch          channel
+ * @param      bw              bandwidth
+ *
+ * @return     > 0 if successful or 0 otherwise
+ *
+ */
+extern uint16 wf_channel2chspec(uint ctl_ch, uint bw);
+
+extern uint wf_channel2freq(uint channel);
+extern uint wf_freq2channel(uint freq);
+
+
+#endif /* _bcmwifi_channels_h_ */
index 68acfca..4b6399e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Indices for 802.11 a/b/g/n/ac 1-3 chain symmetric transmit rates
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  * 
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -15,7 +15,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: bcmwifi_rates.h 252708 2011-04-12 06:45:56Z $
+ * $Id: bcmwifi_rates.h 5187 2012-06-29 06:17:50Z $
  */
 
 #ifndef _bcmwifi_rates_h_
@@ -23,7 +23,7 @@
 
 #ifdef __cplusplus
 extern "C" {
-#endif 
+#endif /* __cplusplus */
 
 
 #define WL_RATESET_SZ_DSSS             4
@@ -33,30 +33,33 @@ extern "C" {
 
 #define WL_TX_CHAINS_MAX       3
 
-#define WL_RATE_DISABLED               (-128) 
-
+#define WL_RATE_DISABLED               (-128) /* Power value corresponding to unsupported rate */
 
+/* Transmit channel bandwidths */
 typedef enum wl_tx_bw {
        WL_TX_BW_20,
        WL_TX_BW_40,
        WL_TX_BW_80,
        WL_TX_BW_20IN40,
        WL_TX_BW_20IN80,
-       WL_TX_BW_40IN80,
-       WL_TX_BW_ALL
+       WL_TX_BW_40IN80
 } wl_tx_bw_t;
 
 
-
+/*
+ * Transmit modes.
+ * Not all modes are listed here, only those required for disambiguation. e.g. SPEXP is not listed
+ */
 typedef enum wl_tx_mode {
        WL_TX_MODE_NONE,
        WL_TX_MODE_STBC,
        WL_TX_MODE_CDD,
-       WL_TX_MODE_SDM
+       WL_TX_MODE_TXBF,
+       WL_NUM_TX_MODES
 } wl_tx_mode_t;
 
 
-
+/* Number of transmit chains */
 typedef enum wl_tx_chains {
        WL_TX_CHAINS_1 = 1,
        WL_TX_CHAINS_2,
@@ -64,7 +67,7 @@ typedef enum wl_tx_chains {
 } wl_tx_chains_t;
 
 
-
+/* Number of transmit streams */
 typedef enum wl_tx_nss {
        WL_TX_NSS_1 = 1,
        WL_TX_NSS_2,
@@ -73,9 +76,12 @@ typedef enum wl_tx_nss {
 
 
 typedef enum clm_rates {
-       
+       /************
+       * 1 chain  *
+       ************
+       */
 
-       
+       /* 1 Stream */
        WL_RATE_1X1_DSSS_1         = 0,
        WL_RATE_1X1_DSSS_2         = 1,
        WL_RATE_1X1_DSSS_5_5       = 2,
@@ -111,9 +117,12 @@ typedef enum clm_rates {
        WL_RATE_1X1_VHT9SS1        = 21,
 
 
-       
+       /************
+       * 2 chains *
+       ************
+       */
 
-       
+       /* 1 Stream expanded + 1 */
        WL_RATE_1X2_DSSS_1         = 22,
        WL_RATE_1X2_DSSS_2         = 23,
        WL_RATE_1X2_DSSS_5_5       = 24,
@@ -148,7 +157,7 @@ typedef enum clm_rates {
        WL_RATE_1X2_VHT8SS1        = 42,
        WL_RATE_1X2_VHT9SS1        = 43,
 
-       
+       /* 2 Streams */
        WL_RATE_2X2_STBC_MCS0      = 44,
        WL_RATE_2X2_STBC_MCS1      = 45,
        WL_RATE_2X2_STBC_MCS2      = 46,
@@ -189,10 +198,12 @@ typedef enum clm_rates {
        WL_RATE_2X2_VHT8SS2        = 62,
        WL_RATE_2X2_VHT9SS2        = 63,
 
+       /************
+       * 3 chains *
+       ************
+       */
 
-       
-
-       
+       /* 1 Stream expanded + 2 */
        WL_RATE_1X3_DSSS_1         = 64,
        WL_RATE_1X3_DSSS_2         = 65,
        WL_RATE_1X3_DSSS_5_5       = 66,
@@ -227,7 +238,7 @@ typedef enum clm_rates {
        WL_RATE_1X3_VHT8SS1        = 84,
        WL_RATE_1X3_VHT9SS1        = 85,
 
-       
+       /* 2 Streams expanded + 1 */
        WL_RATE_2X3_STBC_MCS0      = 86,
        WL_RATE_2X3_STBC_MCS1      = 87,
        WL_RATE_2X3_STBC_MCS2      = 88,
@@ -268,7 +279,7 @@ typedef enum clm_rates {
        WL_RATE_2X3_VHT8SS2        = 104,
        WL_RATE_2X3_VHT9SS2        = 105,
 
-       
+       /* 3 Streams */
        WL_RATE_3X3_SDM_MCS16      = 106,
        WL_RATE_3X3_SDM_MCS17      = 107,
        WL_RATE_3X3_SDM_MCS18      = 108,
@@ -289,12 +300,148 @@ typedef enum clm_rates {
        WL_RATE_3X3_VHT8SS3        = 114,
        WL_RATE_3X3_VHT9SS3        = 115,
 
-       
-       WL_NUMRATES                = 116
+
+       /****************************
+        * TX Beamforming, 2 chains *
+        ****************************
+        */
+
+       /* 1 Stream expanded + 1 */
+
+       WL_RATE_1X2_TXBF_OFDM_6    = 116,
+       WL_RATE_1X2_TXBF_OFDM_9    = 117,
+       WL_RATE_1X2_TXBF_OFDM_12   = 118,
+       WL_RATE_1X2_TXBF_OFDM_18   = 119,
+       WL_RATE_1X2_TXBF_OFDM_24   = 120,
+       WL_RATE_1X2_TXBF_OFDM_36   = 121,
+       WL_RATE_1X2_TXBF_OFDM_48   = 122,
+       WL_RATE_1X2_TXBF_OFDM_54   = 123,
+
+       WL_RATE_1X2_TXBF_MCS0      = 124,
+       WL_RATE_1X2_TXBF_MCS1      = 125,
+       WL_RATE_1X2_TXBF_MCS2      = 126,
+       WL_RATE_1X2_TXBF_MCS3      = 127,
+       WL_RATE_1X2_TXBF_MCS4      = 128,
+       WL_RATE_1X2_TXBF_MCS5      = 129,
+       WL_RATE_1X2_TXBF_MCS6      = 130,
+       WL_RATE_1X2_TXBF_MCS7      = 131,
+
+       WL_RATE_1X2_TXBF_VHT0SS1   = 124,
+       WL_RATE_1X2_TXBF_VHT1SS1   = 125,
+       WL_RATE_1X2_TXBF_VHT2SS1   = 126,
+       WL_RATE_1X2_TXBF_VHT3SS1   = 127,
+       WL_RATE_1X2_TXBF_VHT4SS1   = 128,
+       WL_RATE_1X2_TXBF_VHT5SS1   = 129,
+       WL_RATE_1X2_TXBF_VHT6SS1   = 130,
+       WL_RATE_1X2_TXBF_VHT7SS1   = 131,
+       WL_RATE_1X2_TXBF_VHT8SS1   = 132,
+       WL_RATE_1X2_TXBF_VHT9SS1   = 133,
+
+       /* 2 Streams */
+
+       WL_RATE_2X2_TXBF_SDM_MCS8  = 134,
+       WL_RATE_2X2_TXBF_SDM_MCS9  = 135,
+       WL_RATE_2X2_TXBF_SDM_MCS10 = 136,
+       WL_RATE_2X2_TXBF_SDM_MCS11 = 137,
+       WL_RATE_2X2_TXBF_SDM_MCS12 = 138,
+       WL_RATE_2X2_TXBF_SDM_MCS13 = 139,
+       WL_RATE_2X2_TXBF_SDM_MCS14 = 140,
+       WL_RATE_2X2_TXBF_SDM_MCS15 = 141,
+
+       WL_RATE_2X2_TXBF_VHT0SS2   = 134,
+       WL_RATE_2X2_TXBF_VHT1SS2   = 135,
+       WL_RATE_2X2_TXBF_VHT2SS2   = 136,
+       WL_RATE_2X2_TXBF_VHT3SS2   = 137,
+       WL_RATE_2X2_TXBF_VHT4SS2   = 138,
+       WL_RATE_2X2_TXBF_VHT5SS2   = 139,
+       WL_RATE_2X2_TXBF_VHT6SS2   = 140,
+       WL_RATE_2X2_TXBF_VHT7SS2   = 141,
+
+
+       /****************************
+        * TX Beamforming, 3 chains *
+        ****************************
+        */
+
+       /* 1 Stream expanded + 2 */
+
+       WL_RATE_1X3_TXBF_OFDM_6    = 142,
+       WL_RATE_1X3_TXBF_OFDM_9    = 143,
+       WL_RATE_1X3_TXBF_OFDM_12   = 144,
+       WL_RATE_1X3_TXBF_OFDM_18   = 145,
+       WL_RATE_1X3_TXBF_OFDM_24   = 146,
+       WL_RATE_1X3_TXBF_OFDM_36   = 147,
+       WL_RATE_1X3_TXBF_OFDM_48   = 148,
+       WL_RATE_1X3_TXBF_OFDM_54   = 149,
+
+       WL_RATE_1X3_TXBF_MCS0      = 150,
+       WL_RATE_1X3_TXBF_MCS1      = 151,
+       WL_RATE_1X3_TXBF_MCS2      = 152,
+       WL_RATE_1X3_TXBF_MCS3      = 153,
+       WL_RATE_1X3_TXBF_MCS4      = 154,
+       WL_RATE_1X3_TXBF_MCS5      = 155,
+       WL_RATE_1X3_TXBF_MCS6      = 156,
+       WL_RATE_1X3_TXBF_MCS7      = 157,
+
+       WL_RATE_1X3_TXBF_VHT0SS1   = 150,
+       WL_RATE_1X3_TXBF_VHT1SS1   = 151,
+       WL_RATE_1X3_TXBF_VHT2SS1   = 152,
+       WL_RATE_1X3_TXBF_VHT3SS1   = 153,
+       WL_RATE_1X3_TXBF_VHT4SS1   = 154,
+       WL_RATE_1X3_TXBF_VHT5SS1   = 155,
+       WL_RATE_1X3_TXBF_VHT6SS1   = 156,
+       WL_RATE_1X3_TXBF_VHT7SS1   = 157,
+       WL_RATE_1X3_TXBF_VHT8SS1   = 158,
+       WL_RATE_1X3_TXBF_VHT9SS1   = 159,
+
+       /* 2 Streams expanded + 1 */
+
+       WL_RATE_2X3_TXBF_SDM_MCS8  = 160,
+       WL_RATE_2X3_TXBF_SDM_MCS9  = 161,
+       WL_RATE_2X3_TXBF_SDM_MCS10 = 162,
+       WL_RATE_2X3_TXBF_SDM_MCS11 = 163,
+       WL_RATE_2X3_TXBF_SDM_MCS12 = 164,
+       WL_RATE_2X3_TXBF_SDM_MCS13 = 165,
+       WL_RATE_2X3_TXBF_SDM_MCS14 = 166,
+       WL_RATE_2X3_TXBF_SDM_MCS15 = 167,
+
+       WL_RATE_2X3_TXBF_VHT0SS2   = 160,
+       WL_RATE_2X3_TXBF_VHT1SS2   = 161,
+       WL_RATE_2X3_TXBF_VHT2SS2   = 162,
+       WL_RATE_2X3_TXBF_VHT3SS2   = 163,
+       WL_RATE_2X3_TXBF_VHT4SS2   = 164,
+       WL_RATE_2X3_TXBF_VHT5SS2   = 165,
+       WL_RATE_2X3_TXBF_VHT6SS2   = 166,
+       WL_RATE_2X3_TXBF_VHT7SS2   = 167,
+       WL_RATE_2X3_TXBF_VHT8SS2   = 168,
+       WL_RATE_2X3_TXBF_VHT9SS2   = 169,
+
+       /* 3 Streams */
+
+       WL_RATE_3X3_TXBF_SDM_MCS16 = 170,
+       WL_RATE_3X3_TXBF_SDM_MCS17 = 171,
+       WL_RATE_3X3_TXBF_SDM_MCS18 = 172,
+       WL_RATE_3X3_TXBF_SDM_MCS19 = 173,
+       WL_RATE_3X3_TXBF_SDM_MCS20 = 174,
+       WL_RATE_3X3_TXBF_SDM_MCS21 = 175,
+       WL_RATE_3X3_TXBF_SDM_MCS22 = 176,
+       WL_RATE_3X3_TXBF_SDM_MCS23 = 177,
+
+       WL_RATE_3X3_TXBF_VHT0SS3   = 170,
+       WL_RATE_3X3_TXBF_VHT1SS3   = 171,
+       WL_RATE_3X3_TXBF_VHT2SS3   = 172,
+       WL_RATE_3X3_TXBF_VHT3SS3   = 173,
+       WL_RATE_3X3_TXBF_VHT4SS3   = 174,
+       WL_RATE_3X3_TXBF_VHT5SS3   = 175,
+       WL_RATE_3X3_TXBF_VHT6SS3   = 176,
+       WL_RATE_3X3_TXBF_VHT7SS3   = 177
 } clm_rates_t;
 
+/* Number of rate codes */
+#define WL_NUMRATES 178
+
 #ifdef __cplusplus
 }
-#endif 
+#endif /* __cplusplus */
 
-#endif 
+#endif /* _bcmwifi_rates_h_ */
index 25e0028..d9f6076 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Definitions subject to change without notice.
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -19,7 +19,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: dhdioctl.h 350488 2012-08-14 04:36:26Z $
+ * $Id: dhdioctl.h 390859 2013-03-14 01:09:31Z $
  */
 
 #ifndef _dhdioctl_h_
@@ -83,7 +83,8 @@ enum {
 #define DHD_ARPOE_VAL  0x4000
 #define DHD_REORDER_VAL        0x8000
 #define DHD_WL_VAL             0x10000
-#define DHD_TRACE2_VAL 0x20000
+#define DHD_NOCHECKDIED_VAL            0x20000 /* UTF WAR */
+#define DHD_WL_VAL2            0x40000
 
 #ifdef SDTEST
 /* For pktgen iovar */
index cec06b4..de34916 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Copyright (C) 1999-2012, Broadcom Corporation
- *
+ * Copyright (C) 1999-2013, Broadcom Corporation
+ * 
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * copyright notice and this permission notice appear in all copies.
@@ -13,7 +13,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: epivers.h.in,v 13.33 2010-09-08 22:08:53 $
+ * $Id: epivers.h.in,v 13.33 2010-09-08 22:08:53 csm Exp $
  *
 */
 
 
 #define        EPI_MAJOR_VERSION       1
 
-#define        EPI_MINOR_VERSION       28
+#define        EPI_MINOR_VERSION       88
 
-#define        EPI_RC_NUMBER           9
+#define        EPI_RC_NUMBER           5
 
-#define        EPI_INCREMENTAL_NUMBER  2
+#define        EPI_INCREMENTAL_NUMBER  0
 
 #define        EPI_BUILD_NUMBER        0
 
-#define        EPI_VERSION             1, 28, 9, 2
-
-#define        EPI_VERSION_NUM         0x011c0902
-
-#define EPI_VERSION_DEV                1.28.9
+#define        EPI_VERSION             1, 88, 5, 0
 
+#define        EPI_VERSION_NUM         0x01580500
 
-#define        EPI_VERSION_STR         "1.28.9.2 (r351283)"
+#define EPI_VERSION_DEV                1.88.5
+#define        EPI_VERSION_STR         "1.88.5 (r)"
 
-#endif
+#endif /* _epivers_h_ */
diff --git a/bcmdhd/dhdutil/include/hndrte_armtrap.h b/bcmdhd/dhdutil/include/hndrte_armtrap.h
new file mode 100644 (file)
index 0000000..8efcf07
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * HNDRTE arm trap handling.
+ *
+ * Copyright (C) 1999-2013, Broadcom Corporation
+ * 
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $Id: hndrte_armtrap.h 261365 2011-05-24 20:42:23Z $
+ */
+
+#ifndef        _hndrte_armtrap_h
+#define        _hndrte_armtrap_h
+
+
+/* ARM trap handling */
+
+/* Trap types defined by ARM (see arminc.h) */
+
+/* Trap locations in lo memory */
+#define        TRAP_STRIDE     4
+#define FIRST_TRAP     TR_RST
+#define LAST_TRAP      (TR_FIQ * TRAP_STRIDE)
+
+#if defined(__ARM_ARCH_4T__)
+#define        MAX_TRAP_TYPE   (TR_FIQ + 1)
+#elif defined(__ARM_ARCH_7M__)
+#define        MAX_TRAP_TYPE   (TR_ISR + ARMCM3_NUMINTS)
+#endif /* __ARM_ARCH_7M__ */
+
+/* The trap structure is defined here as offsets for assembly */
+#define        TR_TYPE         0x00
+#define        TR_EPC          0x04
+#define        TR_CPSR         0x08
+#define        TR_SPSR         0x0c
+#define        TR_REGS         0x10
+#define        TR_REG(n)       (TR_REGS + (n) * 4)
+#define        TR_SP           TR_REG(13)
+#define        TR_LR           TR_REG(14)
+#define        TR_PC           TR_REG(15)
+
+#define        TRAP_T_SIZE     80
+
+#ifndef        _LANGUAGE_ASSEMBLY
+
+#include <typedefs.h>
+
+typedef struct _trap_struct {
+       uint32          type;
+       uint32          epc;
+       uint32          cpsr;
+       uint32          spsr;
+       uint32          r0;     /* a1 */
+       uint32          r1;     /* a2 */
+       uint32          r2;     /* a3 */
+       uint32          r3;     /* a4 */
+       uint32          r4;     /* v1 */
+       uint32          r5;     /* v2 */
+       uint32          r6;     /* v3 */
+       uint32          r7;     /* v4 */
+       uint32          r8;     /* v5 */
+       uint32          r9;     /* sb/v6 */
+       uint32          r10;    /* sl/v7 */
+       uint32          r11;    /* fp/v8 */
+       uint32          r12;    /* ip */
+       uint32          r13;    /* sp */
+       uint32          r14;    /* lr */
+       uint32          pc;     /* r15 */
+} trap_t;
+
+#endif /* !_LANGUAGE_ASSEMBLY */
+
+#endif /* _hndrte_armtrap_h */
diff --git a/bcmdhd/dhdutil/include/hndrte_cons.h b/bcmdhd/dhdutil/include/hndrte_cons.h
new file mode 100644 (file)
index 0000000..b5d8db3
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Console support for hndrte.
+ *
+ * Copyright (C) 1999-2013, Broadcom Corporation
+ * 
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $Id: hndrte_cons.h 383834 2013-02-07 23:21:51Z $
+ */
+#ifndef        _HNDRTE_CONS_H
+#define        _HNDRTE_CONS_H
+
+#include <typedefs.h>
+
+#define CBUF_LEN       (128)
+
+#define LOG_BUF_LEN    1024
+
+typedef struct {
+       uint32          buf;            /* Can't be pointer on (64-bit) hosts */
+       uint            buf_size;
+       uint            idx;
+       char            *_buf_compat;   /* redundant pointer for backward compat. */
+} hndrte_log_t;
+
+typedef struct {
+       /* Virtual UART
+        *   When there is no UART (e.g. Quickturn), the host should write a complete
+        *   input line directly into cbuf and then write the length into vcons_in.
+        *   This may also be used when there is a real UART (at risk of conflicting with
+        *   the real UART).  vcons_out is currently unused.
+        */
+       volatile uint   vcons_in;
+       volatile uint   vcons_out;
+
+       /* Output (logging) buffer
+        *   Console output is written to a ring buffer log_buf at index log_idx.
+        *   The host may read the output when it sees log_idx advance.
+        *   Output will be lost if the output wraps around faster than the host polls.
+        */
+       hndrte_log_t    log;
+
+       /* Console input line buffer
+        *   Characters are read one at a time into cbuf until <CR> is received, then
+        *   the buffer is processed as a command line.  Also used for virtual UART.
+        */
+       uint            cbuf_idx;
+       char            cbuf[CBUF_LEN];
+} hndrte_cons_t;
+
+hndrte_cons_t *hndrte_get_active_cons_state(void);
+
+#endif /* _HNDRTE_CONS_H */
diff --git a/bcmdhd/dhdutil/include/hndrte_debug.h b/bcmdhd/dhdutil/include/hndrte_debug.h
new file mode 100644 (file)
index 0000000..d3785ce
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * HND Run Time Environment debug info area
+ *
+ * Copyright (C) 1999-2013, Broadcom Corporation
+ * 
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $Id: hndrte_debug.h 342211 2012-07-02 02:23:04Z $
+ */
+
+#ifndef        _HNDRTE_DEBUG_H
+#define        _HNDRTE_DEBUG_H
+
+/* Magic number at a magic location to find HNDRTE_DEBUG pointers */
+#define HNDRTE_DEBUG_PTR_PTR_ADDR 0xf8
+#define HNDRTE_DEBUG_PTR_PTR_MAGIC 0x50504244          /* DBPP */
+
+#ifndef _LANGUAGE_ASSEMBLY
+
+/* Includes only when building dongle code */
+
+
+#define NUM_EVENT_LOG_SETS 4
+
+/* We use explicit sizes here since this gets included from different
+ * systems.  The sizes must be the size of the creating system
+ * (currently 32 bit ARM) since this is gleaned from  dump.
+ */
+
+/* Define pointers for use on other systems */
+#define _HD_EVLOG_P    uint32
+#define _HD_CONS_P     uint32
+#define _HD_TRAP_P     uint32
+
+typedef struct hndrte_debug {
+       uint32  magic;
+#define HNDRTE_DEBUG_MAGIC 0x47424544  /* 'DEBG' */
+
+       uint32  version;                /* Debug struct version */
+#define HNDRTE_DEBUG_VERSION 1
+
+       uint32  fwid;                   /* 4 bytes of fw info */
+       char    epivers[32];
+
+       _HD_TRAP_P trap_ptr;            /* trap_t data struct */
+       _HD_CONS_P console;             /* Console  */
+
+       uint32  ram_base;
+       uint32  ram_size;
+
+       uint32  rom_base;
+       uint32  rom_size;
+
+       _HD_EVLOG_P event_log_top;
+
+} hndrte_debug_t;
+
+/*
+ * timeval_t and prstatus_t are copies of the Linux structures.
+ * Included here because we need the definitions for the target processor
+ * (32 bits) and not the definition on the host this is running on
+ * (which could be 64 bits).
+ */
+
+typedef struct             {    /* Time value with microsecond resolution    */
+       uint32 tv_sec;  /* Seconds                                   */
+       uint32 tv_usec; /* Microseconds                              */
+} timeval_t;
+
+
+/* Linux/ARM 32 prstatus for notes section */
+typedef struct prstatus {
+         int32 si_signo;       /* Signal number */
+         int32 si_code;        /* Extra code */
+         int32 si_errno;       /* Errno */
+         uint16 pr_cursig;     /* Current signal.  */
+         uint16 unused;
+         uint32 pr_sigpend;    /* Set of pending signals.  */
+         uint32 pr_sighold;    /* Set of held signals.  */
+         uint32 pr_pid;
+         uint32 pr_ppid;
+         uint32 pr_pgrp;
+         uint32 pr_sid;
+         timeval_t pr_utime;   /* User time.  */
+         timeval_t pr_stime;   /* System time.  */
+         timeval_t pr_cutime;  /* Cumulative user time.  */
+         timeval_t pr_cstime;  /* Cumulative system time.  */
+         uint32 uregs[18];
+         int32 pr_fpvalid;     /* True if math copro being used.  */
+} prstatus_t;
+
+#ifdef DUMP_INFO
+extern hndrte_debug_t hndrte_debug_info __attribute__ ((weak));
+#endif
+
+#endif /* LANGUAGE_ASSEMBLY */
+
+#endif /* _HNDRTE_DEBUG_H */
index f3d9ce8..ed91eae 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Command line options parser.
  *
- * Copyright (C) 1999-2011, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -15,7 +15,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: miniopt.h,v 1.3 2009-01-15 00:06:54 Exp $
+ * $Id: miniopt.h 241182 2011-02-17 21:50:03Z $
  */
 
 
index 5644a93..cbaff68 100644 (file)
@@ -15,7 +15,7 @@
  * #include <packed_section_end.h>
  *
  *
- * Copyright (C) 1999-2011, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * $Id: packed_section_end.h,v 1.4 2008-12-09 23:43:22 Exp $
+ * $Id: packed_section_end.h 241182 2011-02-17 21:50:03Z $
  */
 
 
-
-
+/* Error check - BWL_PACKED_SECTION is defined in packed_section_start.h
+ * and undefined in packed_section_end.h. If it is NOT defined at this
+ * point, then there is a missing include of packed_section_start.h.
+ */
 #ifdef BWL_PACKED_SECTION
        #undef BWL_PACKED_SECTION
 #else
@@ -44,6 +46,9 @@
 
 
 
-
+/* Compiler-specific directives for structure packing are declared in
+ * packed_section_start.h. This marks the end of the structure packing section,
+ * so, undef them here.
+ */
 #undef BWL_PRE_PACKED_STRUCT
 #undef BWL_POST_PACKED_STRUCT
index c6a7053..e005b7b 100644 (file)
@@ -15,7 +15,7 @@
  * #include <packed_section_end.h>
  *
  *
- * Copyright (C) 1999-2012, Broadcom Corporation
+ * Copyright (C) 1999-2013, Broadcom Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  */
 
 
-
+/* Error check - BWL_PACKED_SECTION is defined in packed_section_start.h
+ * and undefined in packed_section_end.h. If it is already defined at this
+ * point, then there is a missing include of packed_section_end.h.
+ */
 #ifdef BWL_PACKED_SECTION
        #error "BWL_PACKED_SECTION is already defined!"
 #else
@@ -43,7 +46,7 @@
 
 
 
-
+/* Declare compiler-specific directives for structure packing. */
 #if defined(__GNUC__) || defined(__lint)
        #define BWL_PRE_PACKED_STRUCT
        #define BWL_POST_PACKED_STRUCT  __attribute__ ((packed))
index e55d1e1..b073369 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Copyright (C) 1999-2012, Broadcom Corporation
- *
+ * Copyright (C) 1999-2013, Broadcom Corporation
+ * 
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * copyright notice and this permission notice appear in all copies.
  *
  * Fundamental types and constants relating to 802.11
  *
- * $Id: 802.11.h 346820 2012-07-24 13:53:12Z $
+ * $Id: 802.11.h 386067 2013-02-19 15:24:20Z $
  */
 
-
 #ifndef _802_11_H_
 #define _802_11_H_
 
 
 #include <proto/wpa.h>
 
-
+/* This marks the start of a packed structure section. */
 #include <packed_section_start.h>
 
 
-#define DOT11_TU_TO_US          1024
-
-
-#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_HTC_LEN           4
-
-#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_IV_MAX_LEN        8
-
-
-#define DOT11_MAX_MPDU_BODY_LEN     2304
-
-#define DOT11_MAX_MPDU_LEN      (DOT11_A4_HDR_LEN + \
+#define DOT11_TU_TO_US                 1024    /* 802.11 Time Unit is 1024 microseconds */
+
+/* Generic 802.11 frame constants */
+#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    /* 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)
-
-#define DOT11_MAX_SSID_LEN      32
-
-
-#define DOT11_DEFAULT_RTS_LEN       2347
-#define DOT11_MAX_RTS_LEN       2347
-
-
-#define DOT11_MIN_FRAG_LEN      256
-#define DOT11_MAX_FRAG_LEN      2346
-#define DOT11_DEFAULT_FRAG_LEN      2346
+                                        DOT11_FCS_LEN) /* d11 max MPDU length */
 
+#define DOT11_MAX_SSID_LEN             32      /* d11 max ssid length */
 
-#define DOT11_MIN_BEACON_PERIOD     1
-#define DOT11_MAX_BEACON_PERIOD     0xFFFF
+/* dot11RTSThreshold */
+#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     /* 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 */
 
-#define DOT11_MIN_DTIM_PERIOD       1
-#define DOT11_MAX_DTIM_PERIOD       0xFF
+/* dot11BeaconPeriod */
+#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       /* d11 min DTIM period */
+#define DOT11_MAX_DTIM_PERIOD          0xFF    /* d11 max DTIM period */
 
-#define DOT11_LLC_SNAP_HDR_LEN      8
-#define DOT11_OUI_LEN           3
+/* 802.2 LLC/SNAP header used by 802.11 per 802.1H */
+#define DOT11_LLC_SNAP_HDR_LEN         8       /* d11 LLC/SNAP header length */
+#define DOT11_OUI_LEN                  3       /* d11 OUI length */
 BWL_PRE_PACKED_STRUCT struct dot11_llc_snap_header {
-       uint8   dsap;
-       uint8   ssap;
-       uint8   ctl;
-       uint8   oui[DOT11_OUI_LEN];
-       uint16  type;
+       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
+                                                */
+       uint16  type;                           /* ethertype */
 } BWL_POST_PACKED_STRUCT;
 
+/* RFC1042 header used by 802.11 per 802.1H */
+#define RFC1042_HDR_LEN        (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN)        /* RCF1042 header length */
 
-#define RFC1042_HDR_LEN (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN)
-
-
-
+/* Generic 802.11 MAC header */
+/*
+ * N.B.: This struct reflects the full 4 address 802.11 MAC header.
+ *              The fields are defined such that the shorter 1, 2, and 3
+ *              address headers just use the first k fields.
+ */
 BWL_PRE_PACKED_STRUCT struct dot11_header {
-       uint16          fc;
-       uint16          durid;
-       struct ether_addr   a1;
-       struct ether_addr   a2;
-       struct ether_addr   a3;
-       uint16          seq;
-       struct ether_addr   a4;
+       uint16                  fc;             /* frame control */
+       uint16                  durid;          /* duration/ID */
+       struct ether_addr       a1;             /* address 1 */
+       struct ether_addr       a2;             /* address 2 */
+       struct ether_addr       a3;             /* address 3 */
+       uint16                  seq;            /* sequence control */
+       struct ether_addr       a4;             /* address 4 */
 } BWL_POST_PACKED_STRUCT;
 
-
+/* Control frames */
 
 BWL_PRE_PACKED_STRUCT struct dot11_rts_frame {
-       uint16          fc;
-       uint16          durid;
-       struct ether_addr   ra;
-       struct ether_addr   ta;
+       uint16                  fc;             /* frame control */
+       uint16                  durid;          /* duration/ID */
+       struct ether_addr       ra;             /* receiver address */
+       struct ether_addr       ta;             /* transmitter address */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_RTS_LEN       16
+#define        DOT11_RTS_LEN           16              /* d11 RTS frame length */
 
 BWL_PRE_PACKED_STRUCT struct dot11_cts_frame {
-       uint16          fc;
-       uint16          durid;
-       struct ether_addr   ra;
+       uint16                  fc;             /* frame control */
+       uint16                  durid;          /* duration/ID */
+       struct ether_addr       ra;             /* receiver address */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_CTS_LEN       10
+#define        DOT11_CTS_LEN           10              /* d11 CTS frame length */
 
 BWL_PRE_PACKED_STRUCT struct dot11_ack_frame {
-       uint16          fc;
-       uint16          durid;
-       struct ether_addr   ra;
+       uint16                  fc;             /* frame control */
+       uint16                  durid;          /* duration/ID */
+       struct ether_addr       ra;             /* receiver address */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_ACK_LEN       10
+#define        DOT11_ACK_LEN           10              /* d11 ACK frame length */
 
 BWL_PRE_PACKED_STRUCT struct dot11_ps_poll_frame {
-       uint16          fc;
-       uint16          durid;
-       struct ether_addr   bssid;
-       struct ether_addr   ta;
+       uint16                  fc;             /* frame control */
+       uint16                  durid;          /* AID */
+       struct ether_addr       bssid;          /* receiver address, STA in AP */
+       struct ether_addr       ta;             /* transmitter address */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_PS_POLL_LEN   16
+#define        DOT11_PS_POLL_LEN       16              /* d11 PS poll frame length */
 
 BWL_PRE_PACKED_STRUCT struct dot11_cf_end_frame {
-       uint16          fc;
-       uint16          durid;
-       struct ether_addr   ra;
-       struct ether_addr   bssid;
+       uint16                  fc;             /* frame control */
+       uint16                  durid;          /* duration/ID */
+       struct ether_addr       ra;             /* receiver address */
+       struct ether_addr       bssid;          /* transmitter address, STA in AP */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_CS_END_LEN    16
-
+#define        DOT11_CS_END_LEN        16              /* d11 CF-END frame length */
 
+/* RWL wifi protocol: The Vendor Specific Action frame is defined for vendor-specific signaling
+*  category+OUI+vendor specific content ( this can be variable)
+*/
 BWL_PRE_PACKED_STRUCT struct dot11_action_wifi_vendor_specific {
-       uint8   category;
-       uint8   OUI[3];
-       uint8   type;
-       uint8   subtype;
-       uint8   data[1040];
+       uint8   category;
+       uint8   OUI[3];
+       uint8   type;
+       uint8   subtype;
+       uint8   data[1040];
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_action_wifi_vendor_specific dot11_action_wifi_vendor_specific_t;
 
-
+/* generic vender specific action frame with variable length */
 BWL_PRE_PACKED_STRUCT struct dot11_action_vs_frmhdr {
-       uint8   category;
-       uint8   OUI[3];
-       uint8   type;
-       uint8   subtype;
-       uint8   data[1];
+       uint8   category;
+       uint8   OUI[3];
+       uint8   type;
+       uint8   subtype;
+       uint8   data[1];
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_action_vs_frmhdr dot11_action_vs_frmhdr_t;
-#define DOT11_ACTION_VS_HDR_LEN 6
-
-#define BCM_ACTION_OUI_BYTE0    0x00
-#define BCM_ACTION_OUI_BYTE1    0x90
-#define BCM_ACTION_OUI_BYTE2    0x4c
+#define DOT11_ACTION_VS_HDR_LEN        6
 
+#define BCM_ACTION_OUI_BYTE0   0x00
+#define BCM_ACTION_OUI_BYTE1   0x90
+#define BCM_ACTION_OUI_BYTE2   0x4c
 
-#define DOT11_BA_CTL_POLICY_NORMAL  0x0000
-#define DOT11_BA_CTL_POLICY_NOACK   0x0001
-#define DOT11_BA_CTL_POLICY_MASK    0x0001
+/* 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
-#define DOT11_BA_CTL_COMPRESSED     0x0004
+#define DOT11_BA_CTL_MTID              0x0002  /* multi tid BA */
+#define DOT11_BA_CTL_COMPRESSED                0x0004  /* compressed bitmap */
 
-#define DOT11_BA_CTL_NUMMSDU_MASK   0x0FC0
-#define DOT11_BA_CTL_NUMMSDU_SHIFT  6
-
-#define DOT11_BA_CTL_TID_MASK       0xF000
-#define DOT11_BA_CTL_TID_SHIFT      12
+#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 */
 
+/* control frame header (BA/BAR) */
 BWL_PRE_PACKED_STRUCT struct dot11_ctl_header {
-       uint16          fc;
-       uint16          durid;
-       struct ether_addr   ra;
-       struct ether_addr   ta;
+       uint16                  fc;             /* frame control */
+       uint16                  durid;          /* duration/ID */
+       struct ether_addr       ra;             /* receiver address */
+       struct ether_addr       ta;             /* transmitter address */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_CTL_HDR_LEN   16
-
+#define DOT11_CTL_HDR_LEN      16              /* control frame hdr len */
 
+/* BAR frame payload */
 BWL_PRE_PACKED_STRUCT struct dot11_bar {
-       uint16          bar_control;
-       uint16          seqnum;
+       uint16                  bar_control;    /* BAR Control */
+       uint16                  seqnum;         /* Starting Sequence control */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_BAR_LEN       4
-
-#define DOT11_BA_BITMAP_LEN 128
-#define DOT11_BA_CMP_BITMAP_LEN 8
+#define DOT11_BAR_LEN          4               /* BAR frame payload length */
 
+#define DOT11_BA_BITMAP_LEN    128             /* bitmap length */
+#define DOT11_BA_CMP_BITMAP_LEN        8               /* compressed bitmap length */
+/* BA frame payload */
 BWL_PRE_PACKED_STRUCT struct dot11_ba {
-       uint16          ba_control;
-       uint16          seqnum;
-       uint8           bitmap[DOT11_BA_BITMAP_LEN];
+       uint16                  ba_control;     /* BA Control */
+       uint16                  seqnum;         /* Starting Sequence control */
+       uint8                   bitmap[DOT11_BA_BITMAP_LEN];    /* Block Ack Bitmap */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_BA_LEN        4
-
+#define DOT11_BA_LEN           4               /* BA frame payload len (wo bitmap) */
 
+/* Management frame header */
 BWL_PRE_PACKED_STRUCT struct dot11_management_header {
-       uint16          fc;
-       uint16          durid;
-       struct ether_addr   da;
-       struct ether_addr   sa;
-       struct ether_addr   bssid;
-       uint16          seq;
+       uint16                  fc;             /* frame control */
+       uint16                  durid;          /* duration/ID */
+       struct ether_addr       da;             /* receiver address */
+       struct ether_addr       sa;             /* transmitter address */
+       struct ether_addr       bssid;          /* BSS ID */
+       uint16                  seq;            /* sequence control */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_MGMT_HDR_LEN  24
-
+#define        DOT11_MGMT_HDR_LEN      24              /* d11 management header length */
 
+/* Management frame payloads */
 
 BWL_PRE_PACKED_STRUCT struct dot11_bcn_prb {
-       uint32          timestamp[2];
-       uint16          beacon_interval;
-       uint16          capability;
+       uint32                  timestamp[2];
+       uint16                  beacon_interval;
+       uint16                  capability;
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_BCN_PRB_LEN   12
-#define DOT11_BCN_PRB_FIXED_LEN 12
+#define        DOT11_BCN_PRB_LEN       12              /* 802.11 beacon/probe frame fixed length */
+#define        DOT11_BCN_PRB_FIXED_LEN 12              /* 802.11 beacon/probe frame fixed length */
 
 BWL_PRE_PACKED_STRUCT struct dot11_auth {
-       uint16          alg;
-       uint16          seq;
-       uint16          status;
+       uint16                  alg;            /* algorithm */
+       uint16                  seq;            /* sequence control */
+       uint16                  status;         /* status code */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_AUTH_FIXED_LEN    6
+#define DOT11_AUTH_FIXED_LEN   6               /* length of auth frame without challenge IE */
 
 BWL_PRE_PACKED_STRUCT struct dot11_assoc_req {
-       uint16          capability;
-       uint16          listen;
+       uint16                  capability;     /* capability information */
+       uint16                  listen;         /* listen interval */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_ASSOC_REQ_FIXED_LEN   4
+#define DOT11_ASSOC_REQ_FIXED_LEN      4       /* length of assoc frame without info elts */
 
 BWL_PRE_PACKED_STRUCT struct dot11_reassoc_req {
-       uint16          capability;
-       uint16          listen;
-       struct ether_addr   ap;
+       uint16                  capability;     /* capability information */
+       uint16                  listen;         /* listen interval */
+       struct ether_addr       ap;             /* Current AP address */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_REASSOC_REQ_FIXED_LEN 10
+#define DOT11_REASSOC_REQ_FIXED_LEN    10      /* length of assoc frame without info elts */
 
 BWL_PRE_PACKED_STRUCT struct dot11_assoc_resp {
-       uint16          capability;
-       uint16          status;
-       uint16          aid;
+       uint16                  capability;     /* capability information */
+       uint16                  status;         /* status code */
+       uint16                  aid;            /* association ID */
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_ASSOC_RESP_FIXED_LEN  6
+#define DOT11_ASSOC_RESP_FIXED_LEN     6       /* length of assoc resp frame without info elts */
 
 BWL_PRE_PACKED_STRUCT struct dot11_action_measure {
-       uint8   category;
-       uint8   action;
-       uint8   token;
-       uint8   data[1];
+       uint8   category;
+       uint8   action;
+       uint8   token;
+       uint8   data[1];
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_ACTION_MEASURE_LEN    3
+#define DOT11_ACTION_MEASURE_LEN       3       /* d11 action measurement header length */
 
 BWL_PRE_PACKED_STRUCT struct dot11_action_ht_ch_width {
-       uint8   category;
-       uint8   action;
-       uint8   ch_width;
+       uint8   category;
+       uint8   action;
+       uint8   ch_width;
 } BWL_POST_PACKED_STRUCT;
 
 BWL_PRE_PACKED_STRUCT struct dot11_action_ht_mimops {
-       uint8   category;
-       uint8   action;
-       uint8   control;
+       uint8   category;
+       uint8   action;
+       uint8   control;
 } BWL_POST_PACKED_STRUCT;
 
 BWL_PRE_PACKED_STRUCT struct dot11_action_sa_query {
@@ -289,10 +298,16 @@ BWL_PRE_PACKED_STRUCT struct dot11_action_sa_query {
        uint16  id;
 } BWL_POST_PACKED_STRUCT;
 
-#define SM_PWRSAVE_ENABLE   1
-#define SM_PWRSAVE_MODE     2
+BWL_PRE_PACKED_STRUCT struct dot11_action_vht_oper_mode {
+       uint8   category;
+       uint8   action;
+       uint8   mode;
+} BWL_POST_PACKED_STRUCT;
 
+#define SM_PWRSAVE_ENABLE      1
+#define SM_PWRSAVE_MODE                2
 
+/* ************* 802.11h related definitions. ************* */
 BWL_PRE_PACKED_STRUCT struct dot11_power_cnst {
        uint8 id;
        uint8 len;
@@ -313,7 +328,7 @@ BWL_PRE_PACKED_STRUCT struct dot11_tpc_rep {
        uint8 margin;
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_tpc_rep dot11_tpc_rep_t;
-#define DOT11_MNG_IE_TPC_REPORT_LEN 2
+#define DOT11_MNG_IE_TPC_REPORT_LEN    2       /* length of IE data, not including 2 byte header */
 
 BWL_PRE_PACKED_STRUCT struct dot11_supp_channels {
        uint8 id;
@@ -323,108 +338,143 @@ BWL_PRE_PACKED_STRUCT struct dot11_supp_channels {
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_supp_channels dot11_supp_channels_t;
 
-
+/* Extension Channel Offset IE: 802.11n-D1.0 spec. added sideband
+ * offset for 40MHz operation.  The possible 3 values are:
+ * 1 = above control channel
+ * 3 = below control channel
+ * 0 = no extension channel
+ */
 BWL_PRE_PACKED_STRUCT struct dot11_extch {
-       uint8   id;
-       uint8   len;
-       uint8   extch;
+       uint8   id;             /* IE ID, 62, DOT11_MNG_EXT_CHANNEL_OFFSET */
+       uint8   len;            /* IE length */
+       uint8   extch;
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_extch dot11_extch_ie_t;
 
 BWL_PRE_PACKED_STRUCT struct dot11_brcm_extch {
-       uint8   id;
-       uint8   len;
-       uint8   oui[3];
-       uint8   type;
-       uint8   extch;
+       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 */
+       uint8   extch;
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_brcm_extch dot11_brcm_extch_ie_t;
 
-#define BRCM_EXTCH_IE_LEN   5
-#define BRCM_EXTCH_IE_TYPE  53
-#define DOT11_EXTCH_IE_LEN  1
-#define DOT11_EXT_CH_MASK   0x03
-#define DOT11_EXT_CH_UPPER  0x01
-#define DOT11_EXT_CH_LOWER  0x03
-#define DOT11_EXT_CH_NONE   0x00
+#define BRCM_EXTCH_IE_LEN      5
+#define BRCM_EXTCH_IE_TYPE     53      /* 802.11n ID not yet assigned */
+#define DOT11_EXTCH_IE_LEN     1
+#define DOT11_EXT_CH_MASK      0x03    /* extension channel mask */
+#define DOT11_EXT_CH_UPPER     0x01    /* ext. ch. on upper sb */
+#define DOT11_EXT_CH_LOWER     0x03    /* ext. ch. on lower sb */
+#define DOT11_EXT_CH_NONE      0x00    /* no extension ch.  */
 
 BWL_PRE_PACKED_STRUCT struct dot11_action_frmhdr {
-       uint8   category;
-       uint8   action;
-       uint8   data[1];
+       uint8   category;
+       uint8   action;
+       uint8   data[1];
 } BWL_POST_PACKED_STRUCT;
-#define DOT11_ACTION_FRMHDR_LEN 2
-
+#define DOT11_ACTION_FRMHDR_LEN        2
 
+/* CSA IE data structure */
 BWL_PRE_PACKED_STRUCT struct dot11_channel_switch {
-       uint8 id;
-       uint8 len;
-       uint8 mode;
-       uint8 channel;
-       uint8 count;
+       uint8 id;       /* id DOT11_MNG_CHANNEL_SWITCH_ID */
+       uint8 len;      /* length of IE */
+       uint8 mode;     /* mode 0 or 1 */
+       uint8 channel;  /* channel switch to */
+       uint8 count;    /* number of beacons before switching */
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_channel_switch dot11_chan_switch_ie_t;
 
-#define DOT11_SWITCH_IE_LEN 3
-
-#define DOT11_CSA_MODE_ADVISORY     0
-#define DOT11_CSA_MODE_NO_TX        1
+#define DOT11_SWITCH_IE_LEN    3       /* length of IE data, not including 2 byte header */
+/* CSA mode - 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. */
 
 BWL_PRE_PACKED_STRUCT struct dot11_action_switch_channel {
-       uint8   category;
-       uint8   action;
-       dot11_chan_switch_ie_t chan_switch_ie;
-       dot11_brcm_extch_ie_t extch_ie;
+       uint8   category;
+       uint8   action;
+       dot11_chan_switch_ie_t chan_switch_ie;  /* for switch IE */
+       dot11_brcm_extch_ie_t extch_ie;         /* extension channel offset */
 } BWL_POST_PACKED_STRUCT;
 
 BWL_PRE_PACKED_STRUCT struct dot11_csa_body {
-       uint8 mode;
-       uint8 reg;
-       uint8 channel;
-       uint8 count;
+       uint8 mode;     /* mode 0 or 1 */
+       uint8 reg;      /* regulatory class */
+       uint8 channel;  /* channel switch to */
+       uint8 count;    /* number of beacons before switching */
 } BWL_POST_PACKED_STRUCT;
 
-
+/* 11n Extended Channel Switch IE data structure */
 BWL_PRE_PACKED_STRUCT struct dot11_ext_csa {
-       uint8 id;
-       uint8 len;
-       struct dot11_csa_body b;
+       uint8 id;       /* id DOT11_MNG_EXT_CHANNEL_SWITCH_ID */
+       uint8 len;      /* length of IE */
+       struct dot11_csa_body b;        /* body of the ie */
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_ext_csa dot11_ext_csa_ie_t;
-#define DOT11_EXT_CSA_IE_LEN    4
+#define DOT11_EXT_CSA_IE_LEN   4       /* length of extended channel switch IE body */
 
 BWL_PRE_PACKED_STRUCT struct dot11_action_ext_csa {
-       uint8   category;
-       uint8   action;
-       dot11_ext_csa_ie_t chan_switch_ie;
+       uint8   category;
+       uint8   action;
+       dot11_ext_csa_ie_t chan_switch_ie;      /* for switch IE */
 } BWL_POST_PACKED_STRUCT;
 
 BWL_PRE_PACKED_STRUCT struct dot11y_action_ext_csa {
-       uint8   category;
-       uint8   action;
-       struct dot11_csa_body b;
+       uint8   category;
+       uint8   action;
+       struct dot11_csa_body b;        /* body of the ie */
+} BWL_POST_PACKED_STRUCT;
+
+/*  Wide Bandwidth Channel Switch IE data structure */
+BWL_PRE_PACKED_STRUCT struct dot11_wide_bw_channel_switch {
+       uint8 id;                               /* id DOT11_MNG_WIDE_BW_CHANNEL_SWITCH_ID */
+       uint8 len;                              /* length of IE */
+       uint8 channel_width;                    /* new channel width */
+       uint8 center_frequency_segment_0;       /* center frequency segment 0 */
+       uint8 center_frequency_segment_1;       /* center frequency segment 1 */
+} BWL_POST_PACKED_STRUCT;
+typedef struct dot11_wide_bw_channel_switch dot11_wide_bw_chan_switch_ie_t;
+
+#define DOT11_WIDE_BW_SWITCH_IE_LEN     3       /* length of IE data, not including 2 byte header */
+
+/* Channel Switch Wrapper IE data structure */
+BWL_PRE_PACKED_STRUCT struct dot11_channel_switch_wrapper {
+       uint8 id;                               /* id DOT11_MNG_WIDE_BW_CHANNEL_SWITCH_ID */
+       uint8 len;                              /* length of IE */
+       dot11_wide_bw_chan_switch_ie_t wb_chan_switch_ie;
 } BWL_POST_PACKED_STRUCT;
+typedef struct dot11_channel_switch_wrapper dot11_chan_switch_wrapper_ie_t;
+
+/* VHT Transmit Power Envelope IE data structure */
+BWL_PRE_PACKED_STRUCT struct dot11_vht_transmit_power_envelope {
+       uint8 id;                               /* id DOT11_MNG_WIDE_BW_CHANNEL_SWITCH_ID */
+       uint8 len;                              /* length of IE */
+       uint8 transmit_power_info;
+       uint8 local_max_transmit_power_20;
+} BWL_POST_PACKED_STRUCT;
+typedef struct dot11_vht_transmit_power_envelope dot11_vht_transmit_power_envelope_ie_t;
+
 
 BWL_PRE_PACKED_STRUCT struct dot11_obss_coex {
-       uint8   id;
-       uint8   len;
-       uint8   info;
+       uint8   id;
+       uint8   len;
+       uint8   info;
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_obss_coex dot11_obss_coex_t;
-#define DOT11_OBSS_COEXINFO_LEN 1
+#define DOT11_OBSS_COEXINFO_LEN        1       /* length of OBSS Coexistence INFO IE */
 
-#define DOT11_OBSS_COEX_INFO_REQ        0x01
-#define DOT11_OBSS_COEX_40MHZ_INTOLERANT    0x02
-#define DOT11_OBSS_COEX_20MHZ_WIDTH_REQ 0x04
+#define        DOT11_OBSS_COEX_INFO_REQ                0x01
+#define        DOT11_OBSS_COEX_40MHZ_INTOLERANT        0x02
+#define        DOT11_OBSS_COEX_20MHZ_WIDTH_REQ 0x04
 
 BWL_PRE_PACKED_STRUCT struct dot11_obss_chanlist {
-       uint8   id;
-       uint8   len;
-       uint8   regclass;
-       uint8   chanlist[1];
+       uint8   id;
+       uint8   len;
+       uint8   regclass;
+       uint8   chanlist[1];
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_obss_chanlist dot11_obss_chanlist_t;
-#define DOT11_OBSS_CHANLIST_FIXED_LEN   1
+#define DOT11_OBSS_CHANLIST_FIXED_LEN  1       /* fixed length of regclass */
 
 BWL_PRE_PACKED_STRUCT struct dot11_extcap_ie {
        uint8 id;
@@ -433,58 +483,73 @@ BWL_PRE_PACKED_STRUCT struct dot11_extcap_ie {
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_extcap_ie dot11_extcap_ie_t;
 
-#define DOT11_EXTCAP_LEN_MAX   7
+#define DOT11_EXTCAP_LEN_MAX   8
+
 #define DOT11_EXTCAP_LEN_COEX  1
 #define DOT11_EXTCAP_LEN_BT    3
 #define DOT11_EXTCAP_LEN_IW    4
 #define DOT11_EXTCAP_LEN_SI    6
 
 #define DOT11_EXTCAP_LEN_TDLS  5
+#define DOT11_11AC_EXTCAP_LEN_TDLS     8
+
+#define DOT11_EXTCAP_LEN_FMS                   2
+#define DOT11_EXTCAP_LEN_PROXY_ARP             2
+#define DOT11_EXTCAP_LEN_TFS                   3
+#define DOT11_EXTCAP_LEN_WNM_SLEEP             3
+#define DOT11_EXTCAP_LEN_TIMBC                 3
+#define DOT11_EXTCAP_LEN_BSSTRANS              3
+#define DOT11_EXTCAP_LEN_DMS                   4
+#define DOT11_EXTCAP_LEN_WNM_NOTIFICATION      6
+#define DOT11_EXTCAP_LEN_TDLS_WBW              8
+#define DOT11_EXTCAP_LEN_OPMODE_NOTIFICATION   8
+
 BWL_PRE_PACKED_STRUCT struct dot11_extcap {
-       uint8 extcap[DOT11_EXTCAP_LEN_TDLS];
+       uint8 extcap[DOT11_EXTCAP_LEN_MAX];
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_extcap dot11_extcap_t;
 
-
-#define TDLS_CAP_TDLS                  37              
-#define TDLS_CAP_PU_BUFFER_STA 28              
-#define TDLS_CAP_PEER_PSM              20              
-#define TDLS_CAP_CH_SW                 30              
-#define TDLS_CAP_PROH                  38              
-#define TDLS_CAP_CH_SW_PROH            39              
-
-#define TDLS_CAP_MAX_BIT               39              
-
-
-
-#define DOT11_MEASURE_TYPE_BASIC    0
-#define DOT11_MEASURE_TYPE_CCA      1
-#define DOT11_MEASURE_TYPE_RPI      2
-#define DOT11_MEASURE_TYPE_CHLOAD       3
-#define DOT11_MEASURE_TYPE_NOISE        4
-#define DOT11_MEASURE_TYPE_BEACON       5
-#define DOT11_MEASURE_TYPE_FRAME    6
-#define DOT11_MEASURE_TYPE_STATS        7
-#define DOT11_MEASURE_TYPE_LCI      8
-#define DOT11_MEASURE_TYPE_TXSTREAM     9
-#define DOT11_MEASURE_TYPE_PAUSE        255
-
-
-#define DOT11_MEASURE_MODE_PARALLEL     (1<<0)
-#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_DUR  (1<<4)
-
-#define DOT11_MEASURE_MODE_LATE     (1<<0)
-#define DOT11_MEASURE_MODE_INCAPABLE    (1<<1)
-#define DOT11_MEASURE_MODE_REFUSED  (1<<2)
-
-#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))
+/* TDLS Capabilities */
+#define DOT11_TDLS_CAP_TDLS                    37              /* TDLS support */
+#define DOT11_TDLS_CAP_PU_BUFFER_STA   28              /* TDLS Peer U-APSD buffer STA support */
+#define DOT11_TDLS_CAP_PEER_PSM                20              /* TDLS Peer PSM support */
+#define DOT11_TDLS_CAP_CH_SW                   30              /* TDLS Channel switch */
+#define DOT11_TDLS_CAP_PROH                    38              /* TDLS prohibited */
+#define DOT11_TDLS_CAP_CH_SW_PROH              39              /* TDLS Channel switch prohibited */
+#define DOT11_TDLS_CAP_TDLS_WIDER_BW   61      /* TDLS Wider Band-Width */
+
+#define TDLS_CAP_MAX_BIT               39              /* TDLS max bit defined in ext cap */
+
+/* 802.11h/802.11k Measurement Request/Report IEs */
+/* Measurement Type field */
+#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 RPI type */
+#define DOT11_MEASURE_TYPE_CHLOAD              3       /* d11 measurement Channel Load type */
+#define DOT11_MEASURE_TYPE_NOISE               4       /* d11 measurement Noise Histogram type */
+#define DOT11_MEASURE_TYPE_BEACON              5       /* d11 measurement Beacon type */
+#define DOT11_MEASURE_TYPE_FRAME       6       /* d11 measurement Frame type */
+#define DOT11_MEASURE_TYPE_STAT                7       /* d11 measurement STA Statistics type */
+#define DOT11_MEASURE_TYPE_LCI         8       /* d11 measurement LCI type */
+#define DOT11_MEASURE_TYPE_TXSTREAM            9       /* d11 measurement TX Stream type */
+#define DOT11_MEASURE_TYPE_PAUSE               255     /* d11 measurement pause type */
+
+/* Measurement Request Modes */
+#define DOT11_MEASURE_MODE_PARALLEL    (1<<0)  /* d11 measurement parallel */
+#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 */
+#define DOT11_MEASURE_MODE_DUR         (1<<4)  /* d11 measurement dur mandatory */
+/* Measurement Report Modes */
+#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)) /* 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 */
 
 BWL_PRE_PACKED_STRUCT struct dot11_meas_req {
        uint8 id;
@@ -497,9 +562,9 @@ BWL_PRE_PACKED_STRUCT struct dot11_meas_req {
        uint16 duration;
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_meas_req dot11_meas_req_t;
-#define DOT11_MNG_IE_MREQ_LEN 14
-
-#define DOT11_MNG_IE_MREQ_FIXED_LEN 3
+#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  /* d11 measurement request IE fixed length */
 
 BWL_PRE_PACKED_STRUCT struct dot11_meas_rep {
        uint8 id;
@@ -520,8 +585,8 @@ BWL_PRE_PACKED_STRUCT struct dot11_meas_rep {
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_meas_rep dot11_meas_rep_t;
 
-
-#define DOT11_MNG_IE_MREP_FIXED_LEN 3
+/* length of Measure Report IE data not including variable len */
+#define DOT11_MNG_IE_MREP_FIXED_LEN    3       /* d11 measurement response IE fixed length */
 
 BWL_PRE_PACKED_STRUCT struct dot11_meas_rep_basic {
        uint8 channel;
@@ -530,15 +595,15 @@ BWL_PRE_PACKED_STRUCT struct dot11_meas_rep_basic {
        uint8 map;
 } BWL_POST_PACKED_STRUCT;
 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 */
 
 BWL_PRE_PACKED_STRUCT struct dot11_quiet {
        uint8 id;
        uint8 len;
-       uint8 count;
-       uint8 period;
-       uint16 duration;
-       uint16 offset;
+       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 offset;  /* TU's offset from TBTT in Count field */
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_quiet dot11_quiet_t;
 
@@ -557,32 +622,32 @@ BWL_PRE_PACKED_STRUCT struct dot11_ibss_dfs {
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_ibss_dfs dot11_ibss_dfs_t;
 
-
-#define WME_OUI         "\x00\x50\xf2"
-#define WME_OUI_LEN     3
-#define WME_OUI_TYPE        2
-#define WME_TYPE        2
-#define WME_SUBTYPE_IE      0
-#define WME_SUBTYPE_PARAM_IE    1
-#define WME_SUBTYPE_TSPEC   2
-#define WME_VER                        1       
-
-
-#define AC_BE           0
-#define AC_BK           1
-#define AC_VI           2
-#define AC_VO           3
-#define AC_COUNT        4
-
-typedef uint8 ac_bitmap_t;
-
-#define AC_BITMAP_NONE      0x0
-#define AC_BITMAP_ALL       0xf
-#define AC_BITMAP_TST(ab, ac)   (((ab) & (1 << (ac))) != 0)
-#define AC_BITMAP_SET(ab, ac)   (((ab) |= (1 << (ac))))
+/* WME Elements */
+#define WME_OUI                        "\x00\x50\xf2"  /* WME OUI */
+#define WME_OUI_LEN            3
+#define WME_OUI_TYPE           2       /* WME type */
+#define WME_TYPE               2       /* WME type, deprecated */
+#define WME_SUBTYPE_IE         0       /* Information Element */
+#define WME_SUBTYPE_PARAM_IE   1       /* Parameter Element */
+#define WME_SUBTYPE_TSPEC      2       /* Traffic Specification */
+#define WME_VER                        1       /* WME version */
+
+/* WME Access Category Indices (ACIs) */
+#define AC_BE                  0       /* Best Effort */
+#define AC_BK                  1       /* Background */
+#define AC_VI                  2       /* Video */
+#define AC_VO                  3       /* Voice */
+#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)
+#define AC_BITMAP_SET(ab, ac)  (((ab) |= (1 << (ac))))
 #define AC_BITMAP_RESET(ab, ac) (((ab) &= ~(1 << (ac))))
 
-
+/* WME Information Element (IE) */
 BWL_PRE_PACKED_STRUCT struct wme_ie {
        uint8 oui[3];
        uint8 type;
@@ -591,16 +656,16 @@ BWL_PRE_PACKED_STRUCT struct wme_ie {
        uint8 qosinfo;
 } BWL_POST_PACKED_STRUCT;
 typedef struct wme_ie wme_ie_t;
-#define WME_IE_LEN 7
+#define WME_IE_LEN 7   /* WME IE length */
 
 BWL_PRE_PACKED_STRUCT struct edcf_acparam {
-       uint8   ACI;
-       uint8   ECW;
-       uint16  TXOP;
+       uint8   ACI;
+       uint8   ECW;
+       uint16  TXOP;           /* stored in network order (ls octet first) */
 } BWL_POST_PACKED_STRUCT;
 typedef struct edcf_acparam edcf_acparam_t;
 
-
+/* WME Parameter Element (PE) */
 BWL_PRE_PACKED_STRUCT struct wme_param_ie {
        uint8 oui[3];
        uint8 type;
@@ -611,126 +676,126 @@ BWL_PRE_PACKED_STRUCT struct wme_param_ie {
        edcf_acparam_t acparam[AC_COUNT];
 } BWL_POST_PACKED_STRUCT;
 typedef struct wme_param_ie wme_param_ie_t;
-#define WME_PARAM_IE_LEN            24
-
-
-#define WME_QI_AP_APSD_MASK         0x80
-#define WME_QI_AP_APSD_SHIFT        7
-#define WME_QI_AP_COUNT_MASK        0x0f
-#define WME_QI_AP_COUNT_SHIFT       0
-
-
-#define WME_QI_STA_MAXSPLEN_MASK    0x60
-#define WME_QI_STA_MAXSPLEN_SHIFT   5
-#define WME_QI_STA_APSD_ALL_MASK    0xf
-#define WME_QI_STA_APSD_ALL_SHIFT   0
-#define WME_QI_STA_APSD_BE_MASK     0x8
-#define WME_QI_STA_APSD_BE_SHIFT    3
-#define WME_QI_STA_APSD_BK_MASK     0x4
-#define WME_QI_STA_APSD_BK_SHIFT    2
-#define WME_QI_STA_APSD_VI_MASK     0x2
-#define WME_QI_STA_APSD_VI_SHIFT    1
-#define WME_QI_STA_APSD_VO_MASK     0x1
-#define WME_QI_STA_APSD_VO_SHIFT    0
-
-
-#define EDCF_AIFSN_MIN               1
-#define EDCF_AIFSN_MAX               15
-#define EDCF_AIFSN_MASK              0x0f
-#define EDCF_ACM_MASK                0x10
-#define EDCF_ACI_MASK                0x60
-#define EDCF_ACI_SHIFT               5
-#define EDCF_AIFSN_SHIFT             12
-
-
-#define EDCF_ECW_MIN                 0
-#define EDCF_ECW_MAX                 15
+#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 */
+
+/* ACI */
+#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 */
+#define EDCF_AIFSN_SHIFT             12          /* 4 MSB(0xFFF) in ifs_ctl for AC idx */
+
+/* ECW */
+#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
-#define EDCF_ECWMAX_MASK             0xf0
-#define EDCF_ECWMAX_SHIFT            4
+#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 */
 
-
-#define EDCF_TXOP_MIN                0
-#define EDCF_TXOP_MAX                65535
+/* TXOP */
+#define EDCF_TXOP_MIN                0           /* TXOP minimum value */
+#define EDCF_TXOP_MAX                65535       /* TXOP maximum value */
 #define EDCF_TXOP2USEC(txop)         ((txop) << 5)
 
-
+/* Default BE ACI value for non-WME connection STA */
 #define NON_EDCF_AC_BE_ACI_STA          0x02
 
-
-#define EDCF_AC_BE_ACI_STA           0x03
-#define EDCF_AC_BE_ECW_STA           0xA4
-#define EDCF_AC_BE_TXOP_STA          0x0000
-#define EDCF_AC_BK_ACI_STA           0x27
-#define EDCF_AC_BK_ECW_STA           0xA4
-#define EDCF_AC_BK_TXOP_STA          0x0000
-#define EDCF_AC_VI_ACI_STA           0x42
-#define EDCF_AC_VI_ECW_STA           0x43
-#define EDCF_AC_VI_TXOP_STA          0x005e
-#define EDCF_AC_VO_ACI_STA           0x62
-#define EDCF_AC_VO_ECW_STA           0x32
-#define EDCF_AC_VO_TXOP_STA          0x002f
-
-
-#define EDCF_AC_BE_ACI_AP            0x03
-#define EDCF_AC_BE_ECW_AP            0x64
-#define EDCF_AC_BE_TXOP_AP           0x0000
-#define EDCF_AC_BK_ACI_AP            0x27
-#define EDCF_AC_BK_ECW_AP            0xA4
-#define EDCF_AC_BK_TXOP_AP           0x0000
-#define EDCF_AC_VI_ACI_AP            0x41
-#define EDCF_AC_VI_ECW_AP            0x43
-#define EDCF_AC_VI_TXOP_AP           0x005e
-#define EDCF_AC_VO_ACI_AP            0x61
-#define EDCF_AC_VO_ECW_AP            0x32
-#define EDCF_AC_VO_TXOP_AP           0x002f
-
-
+/* 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 */
+
+/* EDCA Parameter IE */
 BWL_PRE_PACKED_STRUCT struct edca_param_ie {
        uint8 qosinfo;
        uint8 rsvd;
        edcf_acparam_t acparam[AC_COUNT];
 } BWL_POST_PACKED_STRUCT;
 typedef struct edca_param_ie edca_param_ie_t;
-#define EDCA_PARAM_IE_LEN            18
-
+#define EDCA_PARAM_IE_LEN            18          /* EDCA Parameter IE length */
 
+/* QoS Capability IE */
 BWL_PRE_PACKED_STRUCT struct qos_cap_ie {
        uint8 qosinfo;
 } BWL_POST_PACKED_STRUCT;
 typedef struct qos_cap_ie qos_cap_ie_t;
 
 BWL_PRE_PACKED_STRUCT struct dot11_qbss_load_ie {
-       uint8 id;
+       uint8 id;                       /* 11, DOT11_MNG_QBSS_LOAD_ID */
        uint8 length;
-       uint16 station_count;
-       uint8 channel_utilization;
-       uint16 aac;
+       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 */
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_qbss_load_ie dot11_qbss_load_ie_t;
-#define BSS_LOAD_IE_SIZE       7       
-
-
-#define FIXED_MSDU_SIZE 0x8000
-#define MSDU_SIZE_MASK  0x7fff
-
-
+#define BSS_LOAD_IE_SIZE       7       /* BSS load IE size */
 
-#define INTEGER_SHIFT   13
-#define FRACTION_MASK   0x1FFF
+/* nom_msdu_size */
+#define FIXED_MSDU_SIZE 0x8000         /* MSDU size is fixed */
+#define MSDU_SIZE_MASK 0x7fff          /* (Nominal or fixed) MSDU size */
 
+/* surplus_bandwidth */
+/* Represented as 3 bits of integer, binary point, 13 bits fraction */
+#define        INTEGER_SHIFT   13      /* integer shift */
+#define FRACTION_MASK  0x1FFF  /* fraction mask */
 
+/* Management Notification Frame */
 BWL_PRE_PACKED_STRUCT struct dot11_management_notification {
-       uint8 category;
+       uint8 category;                 /* DOT11_ACTION_NOTIFICATION */
        uint8 action;
        uint8 token;
        uint8 status;
-       uint8 data[1];
+       uint8 data[1];            &