net: wireless: bcmdhd: Update to Version 5.90.195.15
Dmitry Shmidt [Tue, 24 Jan 2012 21:37:34 +0000 (13:37 -0800)]
- Add WFD concurrent mode support

Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>

81 files changed:
drivers/net/wireless/bcmdhd/bcmevent.c
drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c
drivers/net/wireless/bcmdhd/bcmutils.c
drivers/net/wireless/bcmdhd/dhd.h
drivers/net/wireless/bcmdhd/dhd_cdc.c
drivers/net/wireless/bcmdhd/dhd_common.c
drivers/net/wireless/bcmdhd/dhd_linux.c
drivers/net/wireless/bcmdhd/dhd_linux_mon.c
drivers/net/wireless/bcmdhd/dhd_sdio.c
drivers/net/wireless/bcmdhd/dhd_wlfc.h
drivers/net/wireless/bcmdhd/hndpmu.c
drivers/net/wireless/bcmdhd/include/Makefile
drivers/net/wireless/bcmdhd/include/aidmp.h
drivers/net/wireless/bcmdhd/include/bcmcdc.h
drivers/net/wireless/bcmdhd/include/bcmdefs.h
drivers/net/wireless/bcmdhd/include/bcmdevs.h
drivers/net/wireless/bcmdhd/include/bcmendian.h
drivers/net/wireless/bcmdhd/include/bcmpcispi.h
drivers/net/wireless/bcmdhd/include/bcmperf.h
drivers/net/wireless/bcmdhd/include/bcmsdbus.h
drivers/net/wireless/bcmdhd/include/bcmsdh.h
drivers/net/wireless/bcmdhd/include/bcmsdh_sdmmc.h
drivers/net/wireless/bcmdhd/include/bcmsdpcm.h
drivers/net/wireless/bcmdhd/include/bcmsdspi.h
drivers/net/wireless/bcmdhd/include/bcmsdstd.h
drivers/net/wireless/bcmdhd/include/bcmspi.h
drivers/net/wireless/bcmdhd/include/bcmutils.h
drivers/net/wireless/bcmdhd/include/bcmwifi.h
drivers/net/wireless/bcmdhd/include/dhdioctl.h
drivers/net/wireless/bcmdhd/include/epivers.h
drivers/net/wireless/bcmdhd/include/hndpmu.h
drivers/net/wireless/bcmdhd/include/hndrte_armtrap.h
drivers/net/wireless/bcmdhd/include/hndrte_cons.h
drivers/net/wireless/bcmdhd/include/hndsoc.h
drivers/net/wireless/bcmdhd/include/htsf.h
drivers/net/wireless/bcmdhd/include/linux_osl.h
drivers/net/wireless/bcmdhd/include/linuxver.h
drivers/net/wireless/bcmdhd/include/miniopt.h
drivers/net/wireless/bcmdhd/include/msgtrace.h
drivers/net/wireless/bcmdhd/include/osl.h
drivers/net/wireless/bcmdhd/include/packed_section_end.h
drivers/net/wireless/bcmdhd/include/packed_section_start.h
drivers/net/wireless/bcmdhd/include/pcicfg.h
drivers/net/wireless/bcmdhd/include/proto/802.11.h
drivers/net/wireless/bcmdhd/include/proto/802.11_bta.h
drivers/net/wireless/bcmdhd/include/proto/802.11e.h
drivers/net/wireless/bcmdhd/include/proto/802.1d.h
drivers/net/wireless/bcmdhd/include/proto/bcmeth.h
drivers/net/wireless/bcmdhd/include/proto/bcmevent.h
drivers/net/wireless/bcmdhd/include/proto/bcmip.h
drivers/net/wireless/bcmdhd/include/proto/bt_amp_hci.h
drivers/net/wireless/bcmdhd/include/proto/eapol.h
drivers/net/wireless/bcmdhd/include/proto/ethernet.h
drivers/net/wireless/bcmdhd/include/proto/p2p.h
drivers/net/wireless/bcmdhd/include/proto/sdspi.h
drivers/net/wireless/bcmdhd/include/proto/vlan.h
drivers/net/wireless/bcmdhd/include/proto/wpa.h
drivers/net/wireless/bcmdhd/include/sbchipc.h
drivers/net/wireless/bcmdhd/include/sbconfig.h
drivers/net/wireless/bcmdhd/include/sbhnddma.h
drivers/net/wireless/bcmdhd/include/sbpcmcia.h
drivers/net/wireless/bcmdhd/include/sbsdio.h
drivers/net/wireless/bcmdhd/include/sbsdpcmdev.h
drivers/net/wireless/bcmdhd/include/sbsocram.h
drivers/net/wireless/bcmdhd/include/sdio.h
drivers/net/wireless/bcmdhd/include/sdioh.h
drivers/net/wireless/bcmdhd/include/sdiovar.h
drivers/net/wireless/bcmdhd/include/siutils.h
drivers/net/wireless/bcmdhd/include/trxhdr.h
drivers/net/wireless/bcmdhd/include/typedefs.h
drivers/net/wireless/bcmdhd/include/wlfc_proto.h
drivers/net/wireless/bcmdhd/include/wlioctl.h
drivers/net/wireless/bcmdhd/linux_osl.c
drivers/net/wireless/bcmdhd/siutils.c
drivers/net/wireless/bcmdhd/wl_android.c
drivers/net/wireless/bcmdhd/wl_cfg80211.c
drivers/net/wireless/bcmdhd/wl_cfg80211.h
drivers/net/wireless/bcmdhd/wl_cfgp2p.c
drivers/net/wireless/bcmdhd/wl_cfgp2p.h
drivers/net/wireless/bcmdhd/wl_iw.c
drivers/net/wireless/bcmdhd/wl_iw.h

index 24581dd..6a25d9a 100644 (file)
@@ -20,7 +20,7 @@
  *      Notwithstanding the above, under no circumstances may you combine this
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
- * $Id: bcmevent.c,v 1.8.2.7 2011-02-01 06:23:39 Exp $
+ * $Id: bcmevent.c,v 1.8.2.7 2011-02-01 06:23:39 $
  */
 
 #include <typedefs.h>
@@ -29,7 +29,7 @@
 #include <proto/bcmeth.h>
 #include <proto/bcmevent.h>
 
-#if WLC_E_LAST != 85
+#if WLC_E_LAST != 87
 #error "You need to add an entry to bcmevent_names[] for the new event"
 #endif
 
@@ -117,8 +117,10 @@ const bcmevent_name_t bcmevent_names[] = {
        { WLC_E_PFN_SCAN_NONE, "PFN_SCAN_NONE" },
        { WLC_E_PFN_SCAN_ALLGONE, "PFN_SCAN_ALLGONE" },
 #ifdef SOFTAP
-       { WLC_E_GTK_PLUMBED, "GTK_PLUMBED" }
+       { WLC_E_GTK_PLUMBED, "GTK_PLUMBED" },
 #endif
+       { WLC_E_ASSOC_REQ_IE, "ASSOC_REQ_IE" },
+       { WLC_E_ASSOC_RESP_IE, "ASSOC_RESP_IE" }
 };
 
 
index af2a370..08b1f49 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmsdh_sdmmc_linux.c,v 1.8.6.2 2011-02-01 18:38:36 Exp $
+ * $Id: bcmsdh_sdmmc_linux.c 300908 2011-12-06 10:32:01Z $
  */
 
 #include <typedefs.h>
@@ -61,7 +61,7 @@
 #include <dhd_dbg.h>
 
 #ifdef WL_CFG80211
-extern void wl_cfg80211_set_sdio_func(void *func);
+extern void wl_cfg80211_set_parent_dev(void *dev);
 #endif
 
 extern void sdioh_sdmmc_devintr_off(sdioh_info_t *sd);
@@ -118,7 +118,7 @@ static int bcmsdh_sdmmc_probe(struct sdio_func *func,
 
        if (func->num == 2) {
 #ifdef WL_CFG80211
-               wl_cfg80211_set_sdio_func(func);
+               wl_cfg80211_set_parent_dev(&func->dev);
 #endif
                sd_trace(("F2 found, calling bcmsdh_probe_bcmdhd...\n"));
                ret = bcmsdh_probe_bcmdhd(&func->dev);
@@ -153,6 +153,9 @@ static const struct sdio_device_id bcmsdh_sdmmc_ids[] = {
        { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4325) },
        { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4319) },
        { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4330) },
+#ifndef BOARD_PANDA
+       { SDIO_DEVICE_CLASS(SDIO_CLASS_NONE)            },
+#endif
        { /* end: all zeroes */                         },
 };
 
index fbdd7cd..6b578e6 100644 (file)
@@ -20,7 +20,7 @@
  *      Notwithstanding the above, under no circumstances may you combine this
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
- * $Id: bcmutils.c,v 1.277.2.18 2011-01-26 02:32:08 Exp $
+ * $Id: bcmutils.c,v 1.277.2.18 2011-01-26 02:32:08 $
  */
 
 #include <typedefs.h>
@@ -987,7 +987,6 @@ pktsetprio(void *pkt, bool update_vtag)
        return (rc | priority);
 }
 
-#ifndef BCM_BOOTLOADER
 
 static char bcm_undeferrstr[32];
 static const char *bcmerrorstrtable[] = BCMERRSTRINGTABLE;
@@ -1009,7 +1008,6 @@ bcmerrorstr(int bcmerror)
        return bcmerrorstrtable[-bcmerror];
 }
 
-#endif /* !BCM_BOOTLOADER */
 
 
 
index 420e6e4..50eb94d 100644 (file)
@@ -24,7 +24,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: dhd.h 290844 2011-10-20 08:54:39Z $
+ * $Id: dhd.h 301794 2011-12-08 20:41:35Z $
  */
 
 /****************
@@ -83,6 +83,9 @@ enum dhd_bus_state {
 /* max sequential rxcntl timeouts to set HANG event */
 #define MAX_CNTL_TIMEOUT  2
 
+#define DHD_SCAN_ACTIVE_TIME    40 /* ms : Embedded default Active setting from DHD Driver */
+#define DHD_SCAN_PASSIVE_TIME  130 /* ms: Embedded default Passive setting from DHD Driver */
+
 enum dhd_bus_wake_state {
        WAKE_LOCK_OFF,
        WAKE_LOCK_PRIV,
@@ -369,6 +372,12 @@ extern int dhd_net_attach(dhd_pub_t *dhdp, int idx);
 
 /* Indication from bus module regarding removal/absence of dongle */
 extern void dhd_detach(dhd_pub_t *dhdp);
+#if defined(WLP2P) && defined(WL_CFG80211)
+/* To allow attach/detach calls corresponding to p2p0 interface  */
+extern int dhd_attach_p2p(dhd_pub_t *);
+extern int dhd_detach_p2p(dhd_pub_t *);
+#endif /* WLP2P && WL_CFG80211 */
+
 extern void dhd_free(dhd_pub_t *dhdp);
 
 /* Indication from bus module to change flow-control state */
@@ -411,6 +420,8 @@ extern int dhd_custom_get_mac_address(unsigned char *buf);
 extern void dhd_os_sdunlock_sndup_rxq(dhd_pub_t * pub);
 extern void dhd_os_sdlock_eventq(dhd_pub_t * pub);
 extern void dhd_os_sdunlock_eventq(dhd_pub_t * pub);
+
+#ifdef PNO_SUPPORT
 extern int dhd_pno_enable(dhd_pub_t *dhd, int pfn_enabled);
 extern int dhd_pno_clean(dhd_pub_t *dhd);
 extern int dhd_pno_set(dhd_pub_t *dhd, wlc_ssid_t* ssids_local, int nssid,
@@ -421,9 +432,9 @@ extern int dhd_dev_pno_set(struct net_device *dev, wlc_ssid_t* ssids_local,
                            int nssid, ushort  scan_fr, int pno_repeat, int pno_freq_expo_max);
 extern int dhd_dev_pno_enable(struct net_device *dev,  int pfn_enabled);
 extern int dhd_dev_get_pno_status(struct net_device *dev);
-extern int dhd_get_dtim_skip(dhd_pub_t *dhd);
+#endif /* PNO_SUPPORT */
+
 extern bool dhd_check_ap_wfd_mode_set(dhd_pub_t *dhd);
-extern bool dhd_os_check_hang(dhd_pub_t *dhdp, int ifidx, int ret);
 
 #define DHD_UNICAST_FILTER_NUM         0
 #define DHD_BROADCAST_FILTER_NUM       1
@@ -432,6 +443,9 @@ extern bool dhd_os_check_hang(dhd_pub_t *dhdp, int ifidx, int ret);
 extern int net_os_set_packet_filter(struct net_device *dev, int val);
 extern int net_os_rxfilter_add_remove(struct net_device *dev, int val, int num);
 
+extern int dhd_get_dtim_skip(dhd_pub_t *dhd);
+extern bool dhd_os_check_hang(dhd_pub_t *dhdp, int ifidx, int ret);
+
 #ifdef DHD_DEBUG
 extern int write_to_file(dhd_pub_t *dhd, uint8 *buf, int size);
 #endif /* DHD_DEBUG */
@@ -701,12 +715,6 @@ typedef struct dhd_pkttag {
 #define DHD_PKTTAG_DSTN(tag)   ((dhd_pkttag_t*)(tag))->dstn_ether
 
 typedef int (*f_commitpkt_t)(void* ctx, void* p);
-int dhd_wlfc_enable(dhd_pub_t *dhd);
-int dhd_wlfc_interface_event(struct dhd_info *, uint8 action, uint8 ifid, uint8 iftype, uint8* ea);
-int dhd_wlfc_FIFOcreditmap_event(struct dhd_info *dhd, uint8* event_data);
-int dhd_wlfc_event(struct dhd_info *dhd);
-int dhd_os_wlfc_block(dhd_pub_t *pub);
-int dhd_os_wlfc_unblock(dhd_pub_t *pub);
 
 #ifdef PROP_TXSTATUS_DEBUG
 #define DHD_WLFC_CTRINC_MAC_CLOSE(entry)       do { (entry)->closed_ct++; } while (0)
index 8460992..50e275a 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: dhd_cdc.c,v 1.51.6.31 2011-02-09 14:31:43 Exp $
+ * $Id: dhd_cdc.c 301794 2011-12-08 20:41:35Z $
  *
  * BDC is like CDC, except it includes a header for data packets to convey
  * packet priority over the bus, and flags (e.g. to indicate checksum status
@@ -78,6 +78,8 @@ typedef struct dhd_prot {
        unsigned char buf[WLC_IOCTL_MAXLEN + ROUND_UP_MARGIN];
 } dhd_prot_t;
 
+extern int dhd_dbus_txdata(dhd_pub_t *dhdp, void *pktbuf);
+
 static int
 dhdcdc_msg(dhd_pub_t *dhd)
 {
@@ -2174,6 +2176,7 @@ dhd_wlfc_init(dhd_pub_t *dhd)
                WLFC_FLAGS_CREDIT_STATUS_SIGNALS |
                WLFC_FLAGS_HOST_PROPTXSTATUS_ACTIVE : 0;
 
+       dhd->wlfc_state  = NULL;
 
        /*
        try to enable/disable signaling by sending "tlv" iovar. if that fails,
@@ -2463,7 +2466,7 @@ fail:
 #ifndef CONFIG_DHD_USE_STATIC_BUF
        if (cdc != NULL)
                MFREE(dhd->osh, cdc, sizeof(dhd_prot_t));
-#endif
+#endif /* CONFIG_DHD_USE_STATIC_BUF */
        return BCME_NOMEM;
 }
 
@@ -2476,7 +2479,7 @@ dhd_prot_detach(dhd_pub_t *dhd)
 #endif
 #ifndef CONFIG_DHD_USE_STATIC_BUF
        MFREE(dhd->osh, dhd->prot, sizeof(dhd_prot_t));
-#endif
+#endif /* CONFIG_DHD_USE_STATIC_BUF */
        dhd->prot = NULL;
 }
 
index 6035a95..c772426 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: dhd_common.c 290546 2011-10-19 01:55:21Z $
+ * $Id: dhd_common.c 297563 2011-11-20 15:38:29Z $
  */
 #include <typedefs.h>
 #include <osl.h>
@@ -862,6 +862,8 @@ wl_show_host_event(wl_event_msg_t *event, void *event_data)
                break;
 
        case WLC_E_SCAN_COMPLETE:
+       case WLC_E_ASSOC_REQ_IE:
+       case WLC_E_ASSOC_RESP_IE:
        case WLC_E_PMKID_CACHE:
                DHD_EVENT(("MACEVENT: %s\n", event_name));
                break;
index 6fbb544..7018e7a 100644 (file)
@@ -22,7 +22,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: dhd_linux.c 291449 2011-10-22 12:16:26Z $
+ * $Id: dhd_linux.c 301794 2011-12-08 20:41:35Z $
  */
 
 #include <typedefs.h>
@@ -110,6 +110,7 @@ extern bool ap_fw_loaded;
 #include <wl_android.h>
 
 #ifdef ARP_OFFLOAD_SUPPORT
+void aoe_update_host_ipv4_table(dhd_pub_t *dhd_pub, u32 ipa, bool add);
 static int dhd_device_event(struct notifier_block *this,
        unsigned long event,
        void *ptr);
@@ -274,6 +275,10 @@ typedef struct dhd_info {
 #ifdef CONFIG_HAS_EARLYSUSPEND
        struct early_suspend early_suspend;
 #endif /* CONFIG_HAS_EARLYSUSPEND */
+
+#ifdef ARP_OFFLOAD_SUPPORT
+       u32 pend_ipaddr;
+#endif /* ARP_OFFLOAD_SUPPORT */
 } dhd_info_t;
 
 /* Definitions to provide path to the firmware and nvram
@@ -942,8 +947,9 @@ dhd_op_if(dhd_if_t *ifp)
        unsigned long flags;
 #endif
 
+       if (!ifp || !ifp->info || !ifp->idx)
+               return;
        ASSERT(ifp && ifp->info && ifp->idx);   /* Virtual interfaces only */
-
        dhd = ifp->info;
 
        DHD_TRACE(("%s: idx %d, state %d\n", __FUNCTION__, ifp->idx, ifp->state));
@@ -1033,10 +1039,8 @@ dhd_op_if(dhd_if_t *ifp)
        if (ret < 0) {
                ifp->set_multicast = FALSE;
                if (ifp->net) {
-#ifdef WL_CFG80211
-                       wl_cfg80211_post_del((void*)(ifp->net));
-#endif
                        free_netdev(ifp->net);
+                       ifp->net = NULL;
                }
                dhd->iflist[ifp->idx] = NULL;
 #ifdef SOFTAP
@@ -1167,6 +1171,7 @@ dhd_os_wlfc_block(dhd_pub_t *pub)
 {
        dhd_info_t *di = (dhd_info_t *)(pub->info);
        ASSERT(di != NULL);
+
        spin_lock_bh(&di->wlfc_spinlock);
        return 1;
 }
@@ -1200,7 +1205,7 @@ dhd_sendpkt(dhd_pub_t *dhdp, int ifidx, void *pktbuf)
        }
 
        /* Update multicast statistic */
-       if (PKTLEN(dhdp->osh, pktbuf) >= ETHER_ADDR_LEN) {
+       if (PKTLEN(dhdp->osh, pktbuf) >= ETHER_HDR_LEN) {
                uint8 *pktdata = (uint8 *)PKTDATA(dhdp->osh, pktbuf);
                eh = (struct ether_header *)pktdata;
 
@@ -1208,6 +1213,9 @@ dhd_sendpkt(dhd_pub_t *dhdp, int ifidx, void *pktbuf)
                        dhdp->tx_multicast++;
                if (ntoh16(eh->ether_type) == ETHER_TYPE_802_1X)
                        atomic_inc(&dhd->pend_8021x_cnt);
+       } else {
+               PKTFREE(dhd->pub.osh, pktbuf, TRUE);
+               return BCME_ERROR;
        }
 
        /* Look into the packet and update the packet priority */
@@ -1594,8 +1602,10 @@ dhd_get_stats(struct net_device *net)
        DHD_TRACE(("%s: Enter\n", __FUNCTION__));
 
        ifidx = dhd_net2idx(dhd, net);
-       if (ifidx == DHD_BAD_IF)
+       if (ifidx == DHD_BAD_IF) {
+               DHD_ERROR(("%s: BAD_IF\n", __FUNCTION__));
                return NULL;
+       }
 
        ifp = dhd->iflist[ifidx];
        ASSERT(dhd && ifp);
@@ -2044,6 +2054,7 @@ dhd_ioctl_entry(struct net_device *net, struct ifreq *ifr, int cmd)
        DHD_TRACE(("%s: ifidx %d, cmd 0x%04x\n", __FUNCTION__, ifidx, cmd));
 
        if (ifidx == DHD_BAD_IF) {
+               DHD_ERROR(("%s: BAD IF\n", __FUNCTION__));
                DHD_OS_WAKE_UNLOCK(&dhd->pub);
                return -1;
        }
@@ -2241,6 +2252,7 @@ dhd_cleanup_virt_ifaces(dhd_info_t *dhd)
 #endif
 
        for (i = 1; i < DHD_MAX_IFS; i++) {
+               dhd_net_if_lock_local(dhd);
                if (dhd->iflist[i]) {
                        DHD_TRACE(("Deleting IF: %d \n", i));
                        if ((dhd->iflist[i]->state != DHD_IF_DEL) &&
@@ -2250,6 +2262,7 @@ dhd_cleanup_virt_ifaces(dhd_info_t *dhd)
                                dhd_op_if(dhd->iflist[i]);
                        }
                }
+               dhd_net_if_unlock_local(dhd);
        }
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27))
@@ -2365,7 +2378,6 @@ dhd_open(struct net_device *net)
 #endif /* defined(WL_CFG80211) */
 
                if (dhd->pub.busstate != DHD_BUS_DATA) {
-                       int ret;
 
                        /* try to bring up bus */
                        if ((ret = dhd_bus_start(&dhd->pub)) != 0) {
@@ -2491,6 +2503,26 @@ dhd_del_if(dhd_info_t *dhd, int ifidx)
        up(&dhd->thr_sysioc_ctl.sema);
 }
 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31))
+static struct net_device_ops dhd_ops_pri = {
+       .ndo_open = dhd_open,
+       .ndo_stop = dhd_stop,
+       .ndo_get_stats = dhd_get_stats,
+       .ndo_do_ioctl = dhd_ioctl_entry,
+       .ndo_start_xmit = dhd_start_xmit,
+       .ndo_set_mac_address = dhd_set_mac_address,
+       .ndo_set_multicast_list = dhd_set_multicast_list,
+};
+
+static struct net_device_ops dhd_ops_virt = {
+       .ndo_get_stats = dhd_get_stats,
+       .ndo_do_ioctl = dhd_ioctl_entry,
+       .ndo_start_xmit = dhd_start_xmit,
+       .ndo_set_mac_address = dhd_set_mac_address,
+       .ndo_set_multicast_list = dhd_set_multicast_list,
+};
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) */
+
 dhd_pub_t *
 dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen, void *dev)
 {
@@ -2684,6 +2716,7 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen, void *dev)
 #endif
 
 #ifdef ARP_OFFLOAD_SUPPORT
+       dhd->pend_ipaddr = 0;
        register_inetaddr_notifier(&dhd_notifier);
 #endif /* ARP_OFFLOAD_SUPPORT */
 
@@ -2717,7 +2750,8 @@ dhd_bus_start(dhd_pub_t *dhdp)
        DHD_TRACE(("Enter %s:\n", __FUNCTION__));
 
 #ifdef DHDTHREAD
-       dhd_os_sdlock(dhdp);
+       if (dhd->threads_only)
+               dhd_os_sdlock(dhdp);
 #endif /* DHDTHREAD */
 
        /* try to download image and nvram to the dongle */
@@ -2730,14 +2764,16 @@ dhd_bus_start(dhd_pub_t *dhdp)
                        DHD_ERROR(("%s: dhdsdio_probe_download failed. firmware = %s nvram = %s\n",
                                   __FUNCTION__, fw_path, nv_path));
 #ifdef DHDTHREAD
-                       dhd_os_sdunlock(dhdp);
+                       if (dhd->threads_only)
+                               dhd_os_sdunlock(dhdp);
 #endif /* DHDTHREAD */
                        return -1;
                }
        }
        if (dhd->pub.busstate != DHD_BUS_LOAD) {
 #ifdef DHDTHREAD
-               dhd_os_sdunlock(dhdp);
+               if (dhd->threads_only)
+                       dhd_os_sdunlock(dhdp);
 #endif /* DHDTHREAD */
                return -ENETDOWN;
        }
@@ -2751,7 +2787,8 @@ dhd_bus_start(dhd_pub_t *dhdp)
 
                DHD_ERROR(("%s, dhd_bus_init failed %d\n", __FUNCTION__, ret));
 #ifdef DHDTHREAD
-               dhd_os_sdunlock(dhdp);
+               if (dhd->threads_only)
+                       dhd_os_sdunlock(dhdp);
 #endif /* DHDTHREAD */
                return ret;
        }
@@ -2767,7 +2804,8 @@ dhd_bus_start(dhd_pub_t *dhdp)
 
                DHD_ERROR(("%s Host failed to register for OOB\n", __FUNCTION__));
 #ifdef DHDTHREAD
-               dhd_os_sdunlock(dhdp);
+               if (dhd->threads_only)
+                       dhd_os_sdunlock(dhdp);
 #endif /* DHDTHREAD */
                return -ENODEV;
        }
@@ -2784,13 +2822,15 @@ dhd_bus_start(dhd_pub_t *dhdp)
                del_timer_sync(&dhd->timer);
                DHD_ERROR(("%s failed bus is not ready\n", __FUNCTION__));
 #ifdef DHDTHREAD
-               dhd_os_sdunlock(dhdp);
+               if (dhd->threads_only)
+                       dhd_os_sdunlock(dhdp);
 #endif /* DHDTHREAD */
                return -ENODEV;
        }
 
 #ifdef DHDTHREAD
-       dhd_os_sdunlock(dhdp);
+       if (dhd->threads_only)
+               dhd_os_sdunlock(dhdp);
 #endif /* DHDTHREAD */
 
 #ifdef READ_MACADDR
@@ -2805,6 +2845,15 @@ dhd_bus_start(dhd_pub_t *dhdp)
        dhd_write_macaddr(dhd->pub.mac.octet);
 #endif
 
+#ifdef ARP_OFFLOAD_SUPPORT
+       if (dhd->pend_ipaddr) {
+#ifdef AOE_IP_ALIAS_SUPPORT
+               aoe_update_host_ipv4_table(&dhd->pub, dhd->pend_ipaddr, TRUE);
+#endif /* AOE_IP_ALIAS_SUPPORT */
+               dhd->pend_ipaddr = 0;
+       }
+#endif /* ARP_OFFLOAD_SUPPORT */
+
        return 0;
 }
 
@@ -2824,9 +2873,9 @@ dhd_preinit_ioctls(dhd_pub_t *dhd)
 #if defined(ARP_OFFLOAD_SUPPORT)
        int arpoe = 1;
 #endif
-       int scan_assoc_time = 40;
+       int scan_assoc_time = DHD_SCAN_ACTIVE_TIME;
        int scan_unassoc_time = 40;
-       int scan_passive_time = 130;
+       int scan_passive_time = DHD_SCAN_PASSIVE_TIME;
        char buf[WLC_IOCTL_SMLEN];
        char *ptr;
        uint32 listen_interval = LISTEN_INTERVAL; /* Default Listen Interval in Beacons */
@@ -3025,6 +3074,8 @@ dhd_preinit_ioctls(dhd_pub_t *dhd)
        setbit(eventmask, WLC_E_LINK);
        setbit(eventmask, WLC_E_NDIS_LINK);
        setbit(eventmask, WLC_E_MIC_ERROR);
+       setbit(eventmask, WLC_E_ASSOC_REQ_IE);
+       setbit(eventmask, WLC_E_ASSOC_RESP_IE);
        setbit(eventmask, WLC_E_PMKID_CACHE);
        setbit(eventmask, WLC_E_JOIN_START);
        setbit(eventmask, WLC_E_SCAN_COMPLETE);
@@ -3144,26 +3195,6 @@ dhd_iovar(dhd_pub_t *pub, int ifidx, char *name, char *cmd_buf, uint cmd_len, in
        return ret;
 }
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31))
-static struct net_device_ops dhd_ops_pri = {
-       .ndo_open = dhd_open,
-       .ndo_stop = dhd_stop,
-       .ndo_get_stats = dhd_get_stats,
-       .ndo_do_ioctl = dhd_ioctl_entry,
-       .ndo_start_xmit = dhd_start_xmit,
-       .ndo_set_mac_address = dhd_set_mac_address,
-       .ndo_set_multicast_list = dhd_set_multicast_list,
-};
-
-static struct net_device_ops dhd_ops_virt = {
-       .ndo_get_stats = dhd_get_stats,
-       .ndo_do_ioctl = dhd_ioctl_entry,
-       .ndo_start_xmit = dhd_start_xmit,
-       .ndo_set_mac_address = dhd_set_mac_address,
-       .ndo_set_multicast_list = dhd_set_multicast_list,
-};
-#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) */
-
 int dhd_change_mtu(dhd_pub_t *dhdp, int new_mtu, int ifidx)
 {
        struct dhd_info *dhd = dhdp->info;
@@ -3267,9 +3298,13 @@ static int dhd_device_event(struct notifier_block *this,
                        DHD_ARPOE(("%s: [%s] Up IP: 0x%x\n",
                                __FUNCTION__, ifa->ifa_label, ifa->ifa_address));
 
-                       /* firmware not downloaded, do nothing */
-                       if (dhd->pub.busstate == DHD_BUS_DOWN) {
-                               DHD_ERROR(("%s: bus is down, exit\n", __FUNCTION__));
+                       if (dhd->pub.busstate != DHD_BUS_DATA) {
+                               DHD_ERROR(("%s: bus not ready, exit\n", __FUNCTION__));
+                               if (dhd->pend_ipaddr) {
+                                       DHD_ERROR(("%s: overwrite pending ipaddr: 0x%x\n",
+                                               __FUNCTION__, dhd->pend_ipaddr));
+                               }
+                               dhd->pend_ipaddr = ifa->ifa_address;
                                break;
                        }
 
@@ -3287,7 +3322,7 @@ static int dhd_device_event(struct notifier_block *this,
                case NETDEV_DOWN:
                        DHD_ARPOE(("%s: [%s] Down IP: 0x%x\n",
                                __FUNCTION__, ifa->ifa_label, ifa->ifa_address));
-
+                       dhd->pend_ipaddr = 0;
 #ifdef AOE_IP_ALIAS_SUPPORT
                if (!(ifa->ifa_label[strlen(ifa->ifa_label)-2] == 0x3a)) {
                                DHD_ARPOE(("%s: primary interface is down, AOE clr all\n",
@@ -3361,7 +3396,8 @@ dhd_net_attach(dhd_pub_t *dhdp, int ifidx)
                 * portable hotspot.  This will not work in simultaneous AP/STA mode,
                 * nor with P2P.  Need to set the Donlge's MAC address, and then use that.
                 */
-               if (ifidx > 0) {
+               if (!memcmp(temp_addr, dhd->iflist[0]->mac_addr,
+                       ETHER_ADDR_LEN)) {
                        DHD_ERROR(("%s interface [%s]: set locally administered bit in MAC\n",
                        __func__, net->name));
                        temp_addr[0] |= 0x02;
@@ -3498,13 +3534,15 @@ void dhd_detach(dhd_pub_t *dhdp)
                dhd_if_t *ifp;
 
                /* Cleanup virtual interfaces */
-               for (i = 1; i < DHD_MAX_IFS; i++)
+               for (i = 1; i < DHD_MAX_IFS; i++) {
+                       dhd_net_if_lock_local(dhd);
                        if (dhd->iflist[i]) {
                                dhd->iflist[i]->state = DHD_IF_DEL;
                                dhd->iflist[i]->idx = i;
                                dhd_op_if(dhd->iflist[i]);
                        }
-
+                       dhd_net_if_unlock_local(dhd);
+               }
                /*  delete primary interface 0 */
                ifp = dhd->iflist[0];
                ASSERT(ifp);
@@ -4540,15 +4578,6 @@ int dhd_os_check_wakelock(void *dhdp)
        return 0;
 }
 
-int dhd_os_check_if_up(void *dhdp)
-{
-       dhd_pub_t *pub = (dhd_pub_t *)dhdp;
-
-       if (!pub)
-               return 0;
-       return pub->up;
-}
-
 int net_os_wake_unlock(struct net_device *dev)
 {
        dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev);
@@ -4559,6 +4588,15 @@ int net_os_wake_unlock(struct net_device *dev)
        return ret;
 }
 
+int dhd_os_check_if_up(void *dhdp)
+{
+       dhd_pub_t *pub = (dhd_pub_t *)dhdp;
+
+       if (!pub)
+               return 0;
+       return pub->up;
+}
+
 int dhd_ioctl_entry_local(struct net_device *net, wl_ioctl_t *ioc, int cmd)
 {
        int ifidx;
@@ -4598,8 +4636,8 @@ extern int dhd_wlfc_interface_entry_update(void* state,   ewlfc_mac_entry_action_t
        uint8 iftype, uint8* ea);
 extern int dhd_wlfc_FIFOcreditmap_update(void* state, uint8* credits);
 
-int dhd_wlfc_interface_event(struct dhd_info *dhd, uint8 action, uint8 ifid, uint8 iftype,
-       uint8* ea)
+int dhd_wlfc_interface_event(struct dhd_info *dhd,
+       ewlfc_mac_entry_action_t action, uint8 ifid, uint8 iftype, uint8* ea)
 {
        if (dhd->pub.wlfc_state == NULL)
                return BCME_OK;
index ce94ff9..d4dca26 100644 (file)
@@ -2,13 +2,13 @@
  * Broadcom Dongle Host Driver (DHD), Linux monitor network interface
  *
  * Copyright (C) 1999-2011, Broadcom Corporation
- *
+ * 
  *         Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
  * under the terms of the GNU General Public License version 2 (the "GPL"),
  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
  * following added to such license:
- *
+ * 
  *      As a special exception, the copyright holders of this software give you
  * permission to link this software with independent modules, and to copy and
  * distribute the resulting executable under terms of your choice, provided that
  * the license of that module.  An independent module is a module which is not
  * derived from this software.  The special exception does not apply to any
  * modifications of the software.
- *
+ * 
  *      Notwithstanding the above, under no circumstances may you combine this
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: dhd_linux_mon.c,v 1.131.2.55 2011-02-09 05:31:56 Exp $
+ * $Id: dhd_linux_mon.c 297563 2011-11-20 15:38:29Z $
  */
 
 #include <linux/string.h>
@@ -96,16 +96,30 @@ static const struct net_device_ops dhd_mon_if_ops = {
 static struct net_device* lookup_real_netdev(char *name)
 {
        int i;
+       int len = 0;
        int last_name_len = 0;
        struct net_device *ndev;
        struct net_device *ndev_found = NULL;
 
-       /* We want to find interface "p2p-eth0-0" for monitor interface "mon.p2p-eth0-0", so
-        * we skip "eth0" even if "mon.p2p-eth0-0" contains "eth0"
+       /* We need to find interface "p2p-p2p-0" corresponding to monitor interface "mon-p2p-0",
+        * Once mon iface name reaches IFNAMSIZ, it is reset to p2p0-0 and corresponding mon
+        * iface would be mon-p2p0-0.
         */
        for (i = 0; i < DHD_MAX_IFS; i++) {
                ndev = dhd_idx2net(g_monitor.dhd_pub, i);
-               if (ndev && strstr(name, ndev->name)) {
+
+               /* Skip "p2p" and look for "-p2p0-x" in monitor interface name. If it
+                * it matches, then this netdev is the corresponding real_netdev.
+                */
+               if (ndev && strstr(ndev->name, "p2p-p2p0")) {
+                       len = strlen("p2p");
+               } else {
+               /* if p2p- is not present, then the IFNAMSIZ have reached and name
+                * would have got reset. In this casse,look for p2p0-x in mon-p2p0-x
+                */
+                       len = 0;
+               }
+               if (ndev && strstr(name, (ndev->name + len))) {
                        if (strlen(ndev->name) > last_name_len) {
                                ndev_found = ndev;
                                last_name_len = strlen(ndev->name);
index e5ffc4f..404a649 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: dhd_sdio.c 288105 2011-10-06 01:58:02Z $
+ * $Id: dhd_sdio.c 301794 2011-12-08 20:41:35Z $
  */
 
 #include <typedefs.h>
@@ -1366,9 +1366,7 @@ dhd_bus_txctl(struct dhd_bus *bus, uchar *msg, uint msglen)
                /* Send from dpc */
                bus->ctrl_frame_buf = frame;
                bus->ctrl_frame_len = len;
-
                dhd_wait_for_event(bus->dhd, &bus->ctrl_frame_stat);
-
                if (bus->ctrl_frame_stat == FALSE) {
                        DHD_INFO(("%s: ctrl_frame_stat == FALSE\n", __FUNCTION__));
                        ret = 0;
@@ -3565,7 +3563,7 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq)
                if ((uint8)(txmax - bus->tx_seq) > 0x40) {
                        DHD_ERROR(("%s: got unlikely tx max %d with tx_seq %d\n",
                                   __FUNCTION__, txmax, bus->tx_seq));
-                       txmax = bus->tx_seq;
+                       txmax = bus->tx_max;
                }
                bus->tx_max = txmax;
 
@@ -3766,6 +3764,14 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished)
             !bus->rxskip && rxleft && bus->dhd->busstate != DHD_BUS_DOWN;
             rxseq++, rxleft--) {
 
+#ifdef DHDTHREAD
+               /* tx more to improve rx performance */
+               if ((bus->clkstate == CLK_AVAIL) && !bus->fcstate &&
+                       pktq_mlen(&bus->txq, ~bus->flowcontrol) && DATAOK(bus)) {
+                       dhdsdio_sendfromq(bus, dhd_txbound);
+               }
+#endif /* DHDTHREAD */
+
                /* Handle glomming separately */
                if (bus->glom || bus->glomd) {
                        uint8 cnt;
@@ -3986,7 +3992,7 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished)
                        if ((uint8)(txmax - bus->tx_seq) > 0x40) {
                                        DHD_ERROR(("%s: got unlikely tx max %d with tx_seq %d\n",
                                                __FUNCTION__, txmax, bus->tx_seq));
-                                       txmax = bus->tx_seq;
+                                       txmax = bus->tx_max;
                        }
                        bus->tx_max = txmax;
 
@@ -4143,7 +4149,7 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished)
                if ((uint8)(txmax - bus->tx_seq) > 0x40) {
                        DHD_ERROR(("%s: got unlikely tx max %d with tx_seq %d\n",
                                   __FUNCTION__, txmax, bus->tx_seq));
-                       txmax = bus->tx_seq;
+                       txmax = bus->tx_max;
                }
                bus->tx_max = txmax;
 
@@ -5183,16 +5189,8 @@ dhdsdio_chipmatch(uint16 chipid)
                return TRUE;
        if (chipid == BCM4319_CHIP_ID)
                return TRUE;
-       if (chipid == BCM4336_CHIP_ID)
-               return TRUE;
        if (chipid == BCM4330_CHIP_ID)
                return TRUE;
-       if (chipid == BCM43237_CHIP_ID)
-               return TRUE;
-       if (chipid == BCM43362_CHIP_ID)
-               return TRUE;
-       if (chipid == BCM43239_CHIP_ID)
-               return TRUE;
        return FALSE;
 }
 
@@ -5369,6 +5367,7 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot,
                if (ret == BCME_NOTUP)
                        goto fail;
        }
+
        /* Ok, have the per-port tell the stack we're open for business */
        if (dhd_net_attach(bus->dhd, 0) != 0) {
                DHD_ERROR(("%s: Net attach failed!!\n", __FUNCTION__));
index 59d018b..c4d2518 100644 (file)
@@ -18,7 +18,7 @@
 *      Notwithstanding the above, under no circumstances may you combine this
 * software in any way with any other Broadcom software provided under a license
 * other than the GPL, without Broadcom's express prior written consent.
-* $Id: dhd_wlfc.h,v 1.1.8.1 2010-09-09 22:41:08 Exp $
+* $Id: dhd_wlfc.h 286994 2011-09-29 21:27:44Z $
 *
 */
 #ifndef __wlfc_host_driver_definitions_h__
@@ -201,6 +201,7 @@ typedef struct athost_wl_stat_counters {
 #define WLFC_FCMODE_IMPLIED_CREDIT             1
 #define WLFC_FCMODE_EXPLICIT_CREDIT            2
 
+/* How long to defer borrowing in milliseconds */
 #define WLFC_BORROW_DEFER_PERIOD_MS 100
 
 /* Mask to represent available ACs (note: BC/MC is ignored */
@@ -261,6 +262,15 @@ typedef struct athost_wl_status_info {
 
        /* Timestamp to compute how long to defer borrowing for */
        uint32  borrow_defer_timestamp;
+
 } athost_wl_status_info_t;
 
+int dhd_wlfc_enable(dhd_pub_t *dhd);
+int dhd_wlfc_interface_event(struct dhd_info *,
+       ewlfc_mac_entry_action_t action, uint8 ifid, uint8 iftype, uint8* ea);
+int dhd_wlfc_FIFOcreditmap_event(struct dhd_info *dhd, uint8* event_data);
+int dhd_wlfc_event(struct dhd_info *dhd);
+int dhd_os_wlfc_block(dhd_pub_t *pub);
+int dhd_os_wlfc_unblock(dhd_pub_t *pub);
+
 #endif /* __wlfc_host_driver_definitions_h__ */
index b9586e4..111b5be 100644 (file)
@@ -22,7 +22,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: hndpmu.c,v 1.228.2.56 2011-02-11 22:49:07 Exp $
+ * $Id: hndpmu.c,v 1.228.2.56 2011-02-11 22:49:07 $
  */
 
 #include <typedefs.h>
@@ -93,26 +93,8 @@ static const sdiod_drive_str_t sdiod_drive_strength_tab4_1v8[] = {
        {0, 0x1} };
 
 /* SDIO Drive Strength to sel value table for PMU Rev 11 (1.2v) */
-static const sdiod_drive_str_t sdiod_drive_strength_tab4_1v2[] = {
-       {16, 0x3},
-       {13, 0x2},
-       {11, 0x1},
-       {8, 0x0},
-       {6, 0x7},
-       {4, 0x6},
-       {2, 0x5},
-       {0, 0x4} };
 
 /* SDIO Drive Strength to sel value table for PMU Rev 11 (2.5v) */
-static const sdiod_drive_str_t sdiod_drive_strength_tab4_2v5[] = {
-       {80, 0x5},
-       {65, 0x4},
-       {55, 0x7},
-       {40, 0x6},
-       {30, 0x1},
-       {20, 0x0},
-       {10, 0x3},
-       {0, 0x2} };
 
 /* SDIO Drive Strength to sel value table for PMU Rev 13 (1.8v) */
 static const sdiod_drive_str_t sdiod_drive_strength_tab5_1v8[] = {
@@ -125,14 +107,6 @@ static const sdiod_drive_str_t sdiod_drive_strength_tab5_1v8[] = {
        {0, 0x0} };
 
 /* SDIO Drive Strength to sel value table for PMU Rev 13 (3.3v) */
-static const sdiod_drive_str_t sdiod_drive_strength_tab5_3v3[] = {
-       {12, 0x7},
-       {10, 0x6},
-       {8, 0x5},
-       {6, 0x4},
-       {4, 0x2},
-       {2, 0x1},
-       {0, 0x0} };
 
 
 #define SDIOD_DRVSTR_KEY(chip, pmu)    (((chip) << 16) | (pmu))
@@ -166,27 +140,11 @@ si_sdiod_drive_strength_init(si_t *sih, osl_t *osh, uint32 drivestrength)
                str_mask = 0x00003800;
                str_shift = 11;
                break;
-       case SDIOD_DRVSTR_KEY(BCM4336_CHIP_ID, 8):
-       case SDIOD_DRVSTR_KEY(BCM4336_CHIP_ID, 11):
-               if (sih->pmurev == 8) {
-                       str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab3;
-               }
-               else if (sih->pmurev == 11) {
-                       str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab4_1v8;
-               }
-               str_mask = 0x00003800;
-               str_shift = 11;
-               break;
        case SDIOD_DRVSTR_KEY(BCM4330_CHIP_ID, 12):
                str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab4_1v8;
                str_mask = 0x00003800;
                str_shift = 11;
                break;
-       case SDIOD_DRVSTR_KEY(BCM43362_CHIP_ID, 13):
-               str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab5_1v8;
-               str_mask = 0x00003800;
-               str_shift = 11;
-               break;
        default:
                PMU_MSG(("No SDIO Drive strength init done for chip %s rev %d pmurev %d\n",
                         bcm_chipname(sih->chip, chn, 8), sih->chiprev, sih->pmurev));
index c07266f..67c4906 100644 (file)
@@ -10,7 +10,7 @@
 #
 # Copyright 2005, Broadcom, Inc.
 #
-# $Id: Makefile 241702 2011-02-19 00:41:03Z automrgr $
+# $Id: Makefile 241702 2011-02-19 00:41:03Z $
 #
 
 SRCBASE := ..
index 375df44..b993a03 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: aidmp.h,v 13.4.14.1 2010-03-09 18:40:06 Exp $
+ * $Id: aidmp.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index ce45c50..77a20f8 100644 (file)
@@ -24,7 +24,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmcdc.h,v 13.25.10.3 2010-12-22 23:47:26 Exp $
+ * $Id: bcmcdc.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef _bcmcdc_h_
index da1fd5e..17cc0e9 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmdefs.h,v 13.68.2.8 2011-01-08 04:04:19 Exp $
+ * $Id: bcmdefs.h 279282 2011-08-23 22:44:02Z $
  */
 
 
 
 
 
+
+#define BCM_REFERENCE(data)    ((void)(data))
+
+
+
 #define bcmreclaimed           0
 #define _data  _data
 #define _fn    _fn
+#define BCMPREATTACHDATA(_data)        _data
+#define BCMPREATTACHFN(_fn)    _fn
 #define _data  _data
 #define _fn            _fn
 #define _fn    _fn
+#define        BCMNMIATTACHFN(_fn)     _fn
+#define        BCMNMIATTACHDATA(_data) _data
+#define BCMOVERLAY0DATA(_sym)  _sym
+#define BCMOVERLAY0FN(_fn)     _fn
+#define BCMOVERLAY1DATA(_sym)  _sym
+#define BCMOVERLAY1FN(_fn)     _fn
+#define BCMOVERLAYERRFN(_fn)   _fn
 #define CONST  const
 #define BCMFASTPATH
 
 
 
 #define _data  _data
+#define BCMROMDAT_NAME(_data)  _data
 #define _fn            _fn
 #define _fn    _fn
 #define STATIC static
+#define BCMROMDAT_ARYSIZ(data) ARRAYSIZE(data)
+#define BCMROMDAT_SIZEOF(data) sizeof(data)
+#define BCMROMDAT_APATCH(data)
+#define BCMROMDAT_SPATCH(data)
+
+
+
+#define OVERLAY_INLINE
+#define OSTATIC                        static
+#define BCMOVERLAYDATA(_ovly, _sym)    _sym
+#define BCMOVERLAYFN(_ovly, _fn)       _fn
+#define BCMOVERLAYERRFN(_fn)   _fn
+#define BCMROMOVERLAYDATA(_ovly, _data)        _data
+#define BCMROMOVERLAYFN(_ovly, _fn)            _fn
+#define BCMATTACHOVERLAYDATA(_ovly, _sym)      _sym
+#define BCMATTACHOVERLAYFN(_ovly, _fn)         _fn
+#define BCMINITOVERLAYDATA(_ovly, _sym)                _sym
+#define BCMINITOVERLAYFN(_ovly, _fn)           _fn
+#define BCMUNINITOVERLAYFN(_ovly, _fn)         _fn
+
 
 
 #define        SI_BUS                  0       
index 4f707c0..f0542f2 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmdevs.h,v 13.285.2.39 2011-02-04 05:03:16 Exp $
+ * $Id: bcmdevs.h 295140 2011-11-09 17:22:01Z $
  */
 
 
 
 #define        VENDOR_EPIGRAM          0xfeda
 #define        VENDOR_BROADCOM         0x14e4
+#define        VENDOR_3COM             0x10b7
+#define        VENDOR_NETGEAR          0x1385
+#define        VENDOR_DIAMOND          0x1092
+#define        VENDOR_INTEL            0x8086
+#define        VENDOR_DELL             0x1028
+#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_JMICRON         0x197b
 #define BCM_DNGL_BL_PID_4328   0xbd12
 #define BCM_DNGL_BL_PID_4322   0xbd13
 #define BCM_DNGL_BL_PID_4319    0xbd16
-#define BCM_DNGL_BL_PID_43236   0xbd17
 #define BCM_DNGL_BL_PID_4332   0xbd18
 #define BCM_DNGL_BL_PID_4330   0xbd19
-#define BCM_DNGL_BL_PID_43239   0xbd1b
 #define BCM_DNGL_BDC_PID       0x0bdc
 #define BCM_DNGL_JTAG_PID      0x4a44
+
+
+#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          
+#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 BCM43237_D11N5G_ID     0x4356          
 #define BCM43227_D11N2G_ID     0x4358          
 #define BCM43228_D11N_ID               0x4359          
-#define BCM43228_D11N5G_ID     0x435a           
+#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        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_FLASHMEDIA0_ID 0x8033          
-#define PCIXX21_SDIOH0_ID      0x8034          
 #define PCIXX21_FLASHMEDIA_ID  0x803b          
 #define PCIXX21_SDIOH_ID       0x803c          
 #define R5C822_SDIOH_ID                0x0822          
 #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 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        BCM4342_CHIP_ID         4342            
 #define        BCM4402_CHIP_ID         0x4402          
 #define        BCM4704_CHIP_ID         0x4704          
 #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 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 BCM47188_PKG_ID                9               
+#define BCM4331TT_PKG_ID        8              
+#define BCM4331TN_PKG_ID        9              
+#define BCM4331TNA0_PKG_ID     0xb             
+
+
 #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 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_ENETROBO            0x00000010  
+#define        BFL_NOPLLDOWN           0x00000020  
+#define        BFL_CCKHIPWR            0x00000040  
+#define        BFL_ENETADM             0x00000080  
+#define        BFL_ENETVLAN            0x00000100  
+#ifdef WLAFTERBURNER
+#define        BFL_AFTERBURNER         0x00000200  
+#endif 
+#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 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 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_TX         0x08000000  
+                                               
+#define BFL2_4313_RADIOREG     0x10000000
+                                                                          
+
+
+#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   0x2     
+#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        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            
+
+
+#define        BU4710_BOARD            0x0400
+#define        VSIM4710_BOARD          0x0401
+#define        QT4710_BOARD            0x0402
+
+#define        BU4309_BOARD            0x040a
+#define        BCM94309CB_BOARD        0x040b
+#define        BCM94309MP_BOARD        0x040c
+#define        BCM4309AP_BOARD         0x040d
+
+#define        BCM94302MP_BOARD        0x040e
+
+#define        BU4306_BOARD            0x0416
+#define        BCM94306CB_BOARD        0x0417
+#define        BCM94306MP_BOARD        0x0418
+
+#define        BCM94710D_BOARD         0x041a
+#define        BCM94710R1_BOARD        0x041b
+#define        BCM94710R4_BOARD        0x041c
+#define        BCM94710AP_BOARD        0x041d
+
+#define        BU2050_BOARD            0x041f
+
+#define        BCM94306P50_BOARD       0x0420
+
+#define        BCM94309G_BOARD         0x0421
+
+#define        BU4704_BOARD            0x0423
+#define        BU4702_BOARD            0x0424
+
+#define        BCM94306PC_BOARD        0x0425          
+
+#define        MPSG4306_BOARD          0x0427
+
+#define        BCM94702MN_BOARD        0x0428
+
+
+#define        BCM94702CPCI_BOARD      0x0429
+
+
+#define        BCM95380RR_BOARD        0x042a
+
+
+#define        BCM94306CBSG_BOARD      0x042b
+
+
+#define        PCSG94306_BOARD         0x042d
+
+
+#define        BU4704SD_BOARD          0x042e
+
+
+#define        BCM94704AGR_BOARD       0x042f
+
+
+#define        BCM94308MP_BOARD        0x0430
+
+
+#define        BCM94306GPRS_BOARD      0x0432
+
+
+#define BU5365_FPGA_BOARD      0x0433
+
+#define BU4712_BOARD           0x0444
+#define        BU4712SD_BOARD          0x045d
+#define        BU4712L_BOARD           0x045f
+
+
+#define BCM94712AP_BOARD       0x0445
+#define BCM94712P_BOARD                0x0446
+
+
+#define BU4318_BOARD           0x0447
+#define CB4318_BOARD           0x0448
+#define MPG4318_BOARD          0x0449
+#define MP4318_BOARD           0x044a
+#define SD4318_BOARD           0x044b
+
+
+#define BCM94313BU_BOARD       0x050f
+#define BCM94313HM_BOARD       0x0510
+#define BCM94313EPA_BOARD      0x0511
+#define BCM94313HMG_BOARD       0x051C
+
+
+#define BCM96338_BOARD         0x6338
+#define BCM96348_BOARD         0x6348
+#define BCM96358_BOARD         0x6358
+#define BCM96368_BOARD         0x6368
+
+
+#define        BCM94306P_BOARD         0x044c
+
+
+#define        BCM94303MP_BOARD        0x044e
+
+
+#define        BCM94306MPSGH_BOARD     0x044f
+
+
+#define BCM94306MPM            0x0450
+#define BCM94306MPL            0x0453
+
+
+#define        BCM94712AGR_BOARD       0x0451
+
+
+#define        PC4303_BOARD            0x0454
+
+
+#define        BCM95350K_BOARD         0x0455
+
+
+#define        BCM95350R_BOARD         0x0456
+
+
+#define        BCM94306MPLNA_BOARD     0x0457
+
+
+#define        BU4320_BOARD            0x0458
+#define        BU4320S_BOARD           0x0459
+#define        BCM94320PH_BOARD        0x045a
+
+
+#define        BCM94306MPH_BOARD       0x045b
+
+
+#define        BCM94306PCIV_BOARD      0x045c
+
+#define        BU4712SD_BOARD          0x045d
+
+#define        BCM94320PFLSH_BOARD     0x045e
+
+#define        BU4712L_BOARD           0x045f
+#define        BCM94712LGR_BOARD       0x0460
+#define        BCM94320R_BOARD         0x0461
+
+#define        BU5352_BOARD            0x0462
+
+#define        BCM94318MPGH_BOARD      0x0463
+
+#define        BU4311_BOARD            0x0464
+#define        BCM94311MC_BOARD        0x0465
+#define        BCM94311MCAG_BOARD      0x0466
+
+#define        BCM95352GR_BOARD        0x0467
+
+
+#define        BCM95351AGR_BOARD       0x0470
+
+
+#define        BCM94704MPCB_BOARD      0x0472
+
+
+#define BU4785_BOARD           0x0478
+
+
+#define BU4321_BOARD           0x046b
+#define BU4321E_BOARD          0x047c
+#define MP4321_BOARD           0x046c
+#define CB2_4321_BOARD         0x046d
+#define CB2_4321_AG_BOARD      0x0066
+#define MC4321_BOARD           0x046e
+
+
+#define BU4328_BOARD           0x0481
+#define BCM4328SDG_BOARD       0x0482
+#define BCM4328SDAG_BOARD      0x0483
+#define BCM4328UG_BOARD                0x0484
+#define BCM4328UAG_BOARD       0x0485
+#define BCM4328PC_BOARD                0x0486
+#define BCM4328CF_BOARD                0x0487
+
+
+#define BCM94325DEVBU_BOARD    0x0490
+#define BCM94325BGABU_BOARD    0x0491
+
+#define BCM94325SDGWB_BOARD    0x0492
+
+#define BCM94325SDGMDL_BOARD   0x04aa
+#define BCM94325SDGMDL2_BOARD  0x04c6
+#define BCM94325SDGMDL3_BOARD  0x04c9
+
+#define BCM94325SDABGWBA_BOARD 0x04e1
+
+
+#define BCM94322MC_SSID                0x04a4
+#define BCM94322USB_SSID       0x04a8  
+#define BCM94322HM_SSID                0x04b0
+#define BCM94322USB2D_SSID     0x04bf  
+
+
+#define        BCM4312MCGSG_BOARD      0x04b5
+
+
+#define BCM94315DEVBU_SSID     0x04c2
+#define BCM94315USBGP_SSID     0x04c7
+#define BCM94315BGABU_SSID     0x04ca
+#define BCM94315USBGP41_SSID   0x04cb
+
+
+#define BCM94319DEVBU_SSID     0X04e5
+#define BCM94319USB_SSID       0X04e6
+#define BCM94319SD_SSID                0X04e7
+
+
+#define BCM94716NR2_SSID       0x04cd
+
+
+#define BCM94319DEVBU_SSID     0X04e5
+#define BCM94319USBNP4L_SSID   0X04e6
+#define BCM94319WLUSBN4L_SSID  0X04e7
+#define BCM94319SDG_SSID       0X04ea
+#define BCM94319LCUSBSDN4L_SSID        0X04eb
+#define BCM94319USBB_SSID       0x04ee
+#define BCM94319LCSDN4L_SSID   0X0507
+#define BCM94319LSUSBN4L_SSID  0X0508
+#define BCM94319SDNA4L_SSID    0X0517
+#define BCM94319SDELNA4L_SSID  0X0518
+#define BCM94319SDELNA6L_SSID  0X0539
+#define BCM94319ARCADYAN_SSID  0X0546
+#define BCM94319WINDSOR_SSID    0x0561
+#define BCM94319MLAP_SSID       0x0562
+#define BCM94319SDNA_SSID       0x058b
+#define BCM94319BHEMU3_SSID     0x0563
+#define BCM94319SDHMB_SSID     0x058c
+#define BCM94319SDBREF_SSID     0x05a1
+#define BCM94319USBSDB_SSID     0x05a2
+
+
+
+#define BCM94329AGB_SSID       0X04b9
+#define BCM94329TDKMDL1_SSID   0X04ba
+#define BCM94329TDKMDL11_SSID  0X04fc
+#define BCM94329OLYMPICN18_SSID        0X04fd
+#define BCM94329OLYMPICN90_SSID        0X04fe
+#define BCM94329OLYMPICN90U_SSID 0X050c
+#define BCM94329OLYMPICN90M_SSID 0X050b
+#define BCM94329AGBF_SSID      0X04ff
+#define BCM94329OLYMPICX17_SSID        0X0504
+#define BCM94329OLYMPICX17M_SSID       0X050a
+#define BCM94329OLYMPICX17U_SSID       0X0509
+#define BCM94329OLYMPICUNO_SSID        0X0564
+#define BCM94329MOTOROLA_SSID   0X0565
+#define BCM94329OLYMPICLOCO_SSID       0X0568
+
+#define BCM94336SD_WLBGABU_SSID                0x0511
+#define BCM94336SD_WLBGAREF_SSID       0x0519
+#define BCM94336SDGP_SSID      0x0538
+#define BCM94336SDG_SSID       0x0519
+#define BCM94336SDGN_SSID      0x0538
+#define BCM94336SDGFC_SSID     0x056B
+
+
+#define BCM94330SDG_SSID       0x0528
+#define BCM94330SD_FCBGABU_SSID        0x052e
+#define BCM94330SD_WLBGABU_SSID        0x052f
+#define BCM94330SD_FCBGA_SSID  0x0530
+#define BCM94330FCSDAGB_SSID           0x0532
+#define BCM94330OLYMPICAMG_SSID                0x0549
+#define BCM94330OLYMPICAMGEPA_SSID             0x054F
+#define BCM94330OLYMPICUNO3_SSID       0x0551
+#define BCM94330WLSDAGB_SSID   0x0547
+#define BCM94330CSPSDAGBB_SSID 0x054A
+
+
+#define BCM943224X21        0x056e
+#define BCM943224X21_FCC    0x00d1
+
+
+#define BCM943228BU8_SSID      0x0540
+#define BCM943228BU9_SSID      0x0541
+#define BCM943228BU_SSID       0x0542
+#define BCM943227HM4L_SSID     0x0543
+#define BCM943227HMB_SSID      0x0544
+#define BCM943228HM4L_SSID     0x0545
+#define BCM943228SD_SSID       0x0573
+
+
+#define BCM943239MOD_SSID      0x05ac
+#define BCM943239REF_SSID      0x05aa
+
+
+#define BCM94331X19               0x00D6       
+#define BCM94331PCIEBT3Ax_SSID    0x00E4       
+#define BCM94331X12_2G_SSID       0x00EC       
+#define BCM94331X12_5G_SSID       0x00ED       
+#define BCM94331X29B              0x00EF       
+#define BCM94331BU_SSID           0x0523
+#define BCM94331S9BU_SSID         0x0524
+#define BCM94331MC_SSID           0x0525
+#define BCM94331MCI_SSID          0x0526
+#define BCM94331PCIEBT4_SSID      0x0527
+#define BCM94331HM_SSID           0x0574
+#define BCM94331PCIEDUAL_SSID     0x059B
+#define BCM94331MCH5_SSID         0x05A9
+#define BCM94331PCIEDUALV2_SSID   0x05B7
+#define BCM94331CS_SSID           0x05C6
+#define BCM94331CSAX_SSID         0x00EF
+
+
+#define BCM953572BU_SSID       0x058D
+#define BCM953572NR2_SSID      0x058E
+#define BCM947188NR2_SSID      0x058F
+#define BCM953572SDRNR2_SSID   0x0590
+
+
+#define BCM943236OLYMPICSULLEY_SSID 0x594
+#define BCM943236PREPROTOBLU2O3_SSID 0x5b9
+#define BCM943236USBELNA_SSID 0x5f8
+
+
+#define GPIO_NUMPINS           32
+
+
+#define RDL_RAM_BASE_4319 0x60000000
+#define RDL_RAM_BASE_4329 0x60000000
+#define RDL_RAM_SIZE_4319 0x48000
+#define RDL_RAM_SIZE_4329  0x48000
+#define RDL_RAM_SIZE_43236 0x70000
+#define RDL_RAM_BASE_43236 0x60000000
+#define RDL_RAM_SIZE_4328 0x60000
+#define RDL_RAM_BASE_4328 0x80000000
+#define RDL_RAM_SIZE_4322 0x60000
+#define RDL_RAM_BASE_4322 0x60000000
+
+
+#define MUXENAB_UART           0x00000001
+#define MUXENAB_GPIO           0x00000002
+#define MUXENAB_ERCX           0x00000004
+#define MUXENAB_JTAG           0x00000008
+#define MUXENAB_HOST_WAKE      0x00000010
 
 #endif 
index 04b07ec..f3356a7 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- *  $Id: bcmendian.h,v 1.36 2009-11-09 05:29:43 Exp $
+ *  $Id: bcmendian.h 277737 2011-08-16 17:54:59Z $
  *
  * This file by default provides proper behavior on little-endian architectures.
  * On big-endian architectures, IL_BIGENDIAN should be defined.
index fd148c5..51e0427 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmpcispi.h,v 13.15.112.1 2010-11-15 18:22:12 Exp $
+ * $Id: bcmpcispi.h 277737 2011-08-16 17:54:59Z $
  */
 #ifndef        _BCM_PCI_SPI_H
 #define        _BCM_PCI_SPI_H
index a3985cf..a503edb 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmperf.h,v 13.5 2007-09-14 22:00:59 Exp $
+ * $Id: bcmperf.h 277737 2011-08-16 17:54:59Z $
  */
 /* essai */
 #ifndef _BCMPERF_H_
index 5fda5e9..21a58b4 100644 (file)
@@ -22,7 +22,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmsdbus.h,v 13.17.86.2 2010-12-23 01:13:20 Exp $
+ * $Id: bcmsdbus.h 300017 2011-12-01 20:30:27Z $
  */
 
 #ifndef        _sdio_api_h_
@@ -117,4 +117,12 @@ void *bcmsdh_get_sdioh(bcmsdh_info_t *sdh);
 
 
 
+extern SDIOH_API_RC sdioh_sleep(sdioh_info_t *si, bool enab);
+
+/* GPIO support */
+extern SDIOH_API_RC sdioh_gpio_init(sdioh_info_t *sd);
+extern bool sdioh_gpioin(sdioh_info_t *sd, uint32 gpio);
+extern SDIOH_API_RC sdioh_gpioouten(sdioh_info_t *sd, uint32 gpio);
+extern SDIOH_API_RC sdioh_gpioout(sdioh_info_t *sd, uint32 gpio, bool enab);
+
 #endif /* _sdio_api_h_ */
index 4e3affd..72ee65d 100644 (file)
@@ -23,7 +23,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmsdh.h,v 13.46.52.3 2010-10-19 00:41:44 Exp $
+ * $Id: bcmsdh.h 300017 2011-12-01 20:30:27Z $
  */
 
 #ifndef        _bcmsdh_h_
@@ -208,4 +208,12 @@ extern uint32 bcmsdh_cur_sbwad(void *sdh);
 extern void bcmsdh_chipinfo(void *sdh, uint32 chip, uint32 chiprev);
 
 
+extern int bcmsdh_sleep(void *sdh, bool enab);
+
+/* GPIO support */
+extern int bcmsdh_gpio_init(void *sd);
+extern bool bcmsdh_gpioin(void *sd, uint32 gpio);
+extern int bcmsdh_gpioouten(void *sd, uint32 gpio);
+extern int bcmsdh_gpioout(void *sd, uint32 gpio, bool enab);
+
 #endif /* _bcmsdh_h_ */
index d188c4e..bea97b6 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmsdh_sdmmc.h,v 13.5.88.1 2010-12-23 01:13:20 Exp $
+ * $Id: bcmsdh_sdmmc.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef __BCMSDH_SDMMC_H__
index ee29b5c..1b9d39f 100644 (file)
@@ -22,7 +22,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmsdpcm.h,v 13.4.90.2 2010-05-12 04:14:25 Exp $
+ * $Id: bcmsdpcm.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef        _bcmsdpcm_h_
index 0bff355..a62bee4 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmsdspi.h,v 13.11.86.1 2010-11-15 18:14:56 Exp $
+ * $Id: bcmsdspi.h 277737 2011-08-16 17:54:59Z $
  */
 #ifndef        _BCM_SD_SPI_H
 #define        _BCM_SD_SPI_H
index 0f4c026..c14444c 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmsdstd.h,v 13.21.2.6 2010-11-15 18:14:01 Exp $
+ * $Id: bcmsdstd.h 281604 2011-09-02 18:58:49Z $
  */
 #ifndef        _BCM_SD_STD_H
 #define        _BCM_SD_STD_H
@@ -78,6 +78,7 @@ extern void sdstd_osfree(sdioh_info_t *sd);
 #define SDIOH_CMD7_EXP_STATUS   0x00001E00
 
 #define RETRIES_LARGE 100000
+#define sdstd_os_yield(sd)     do {} while (0)
 #define RETRIES_SMALL 100
 
 
@@ -148,8 +149,8 @@ struct sdioh_info {
        bool            got_hcint;              /* local interrupt flag */
        uint16          last_intrstatus;        /* to cache intrstatus */
        int     host_UHSISupported;             /* whether UHSI is supported for HC. */
-       int     card_UHSI_voltage_Supported;    /* whether UHSI is supported for 
-                                                * Card in terms of Voltage [1.8 or 3.3]. 
+       int     card_UHSI_voltage_Supported;    /* whether UHSI is supported for
+                                                * Card in terms of Voltage [1.8 or 3.3].
                                                 */
        int     global_UHSI_Supp;       /* type of UHSI support in both host and card.
                                         * HOST_SDR_UNSUPP: capabilities not supported/matched
@@ -171,21 +172,6 @@ struct sdioh_info {
 
 #define USE_DMA(sd)            ((bool)((sd->sd_dma_mode > 0) ? TRUE : FALSE))
 
-/* SDIO Host Control Register DMA Mode Definitions */
-#define SDIOH_SDMA_MODE                        0
-#define SDIOH_ADMA1_MODE               1
-#define SDIOH_ADMA2_MODE               2
-#define SDIOH_ADMA2_64_MODE            3
-
-#define ADMA2_ATTRIBUTE_VALID          (1 << 0)        /* ADMA Descriptor line valid */
-#define ADMA2_ATTRIBUTE_END                    (1 << 1)        /* End of Descriptor */
-#define ADMA2_ATTRIBUTE_INT                    (1 << 2)        /* Interrupt when line is done */
-#define ADMA2_ATTRIBUTE_ACT_NOP                (0 << 4)        /* Skip current line, go to next. */
-#define ADMA2_ATTRIBUTE_ACT_RSV                (1 << 4)        /* Same as NOP */
-#define ADMA1_ATTRIBUTE_ACT_SET                (1 << 4)        /* ADMA1 Only - set transfer length */
-#define ADMA2_ATTRIBUTE_ACT_TRAN       (2 << 4)        /* Transfer Data of one descriptor line. */
-#define ADMA2_ATTRIBUTE_ACT_LINK       (3 << 4)        /* Link Descriptor */
-
 /* States for Tuning and corr data */
 #define TUNING_IDLE                    0
 #define TUNING_START                   1
@@ -195,17 +181,6 @@ struct sdioh_info {
 #define DATA_TRANSFER_IDLE             0
 #define DATA_TRANSFER_ONGOING  1
 
-/* ADMA2 Descriptor Table Entry for 32-bit Address */
-typedef struct adma2_dscr_32b {
-       uint32 len_attr;
-       uint32 phys_addr;
-} adma2_dscr_32b_t;
-
-/* ADMA1 Descriptor Table Entry */
-typedef struct adma1_dscr {
-       uint32 phys_addr_attr;
-} adma1_dscr_t;
-
 /************************************************************
  * Internal interfaces: per-port references into bcmsdstd.c
  */
@@ -254,6 +229,7 @@ extern void sdstd_3_disable_retuning_int(sdioh_info_t *sd);
 extern bool sdstd_3_is_retuning_int_set(sdioh_info_t *sd);
 extern bool sdstd_3_check_and_set_retuning(sdioh_info_t *sd);
 extern int sdstd_3_get_tune_state(sdioh_info_t *sd);
+extern int sdstd_3_get_data_state(sdioh_info_t *sd);
 extern void sdstd_3_set_tune_state(sdioh_info_t *sd, int state);
 extern uint8 sdstd_3_get_tuning_exp(sdioh_info_t *sd);
 extern uint32 sdstd_3_get_uhsi_clkmode(sdioh_info_t *sd);
index 0eb2a30..34a02d0 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmspi.h,v 13.5.112.1 2010-11-15 18:13:09 Exp $
+ * $Id: bcmspi.h 277737 2011-08-16 17:54:59Z $
  */
 #ifndef        _BCM_SPI_H
 #define        _BCM_SPI_H
index 530036f..6849c26 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmutils.h,v 13.236.2.16 2011-01-26 00:45:06 Exp $
+ * $Id: bcmutils.h 294991 2011-11-09 00:17:28Z $
  */
 
 
@@ -221,7 +221,9 @@ extern uint16 pktpool_avail(pktpool_t *pktp);
 extern int pktpool_avail_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);
 extern int pktpool_empty_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);
 extern int pktpool_setmaxlen(pktpool_t *pktp, uint16 maxlen);
+extern int pktpool_setmaxlen_strict(osl_t *osh, pktpool_t *pktp, uint16 maxlen);
 extern void pktpool_emptycb_disable(pktpool_t *pktp, bool disable);
+extern bool pktpool_emptycb_disabled(pktpool_t *pktp);
 
 #define POOLPTR(pp)                    ((pktpool_t *)(pp))
 #define pktpool_len(pp)                        (POOLPTR(pp)->len - 1)
@@ -330,6 +332,8 @@ extern char *bcm_ip_ntoa(struct ipv4_addr *ia, char *buf);
 
 extern void bcm_mdelay(uint ms);
 
+#define NVRAM_RECLAIM_CHECK(name)
+
 extern char *getvar(char *vars, const char *name);
 extern int getintvar(char *vars, const char *name);
 extern int getintvararray(char *vars, const char *name, int index);
@@ -534,9 +538,17 @@ extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len);
                                                 & ~((boundary) - 1))
 #define        ISPOWEROF2(x)           ((((x)-1)&(x)) == 0)
 #define VALID_MASK(mask)       !((mask) & ((mask) + 1))
+
 #ifndef OFFSETOF
+#ifdef __ARMCC_VERSION
+
+#include <stddef.h>
+#define        OFFSETOF(type, member)  offsetof(type, member)
+#else
 #define        OFFSETOF(type, member)  ((uint)(uintptr)&((type *)0)->member)
 #endif 
+#endif 
+
 #ifndef ARRAYSIZE
 #define ARRAYSIZE(a)           (sizeof(a)/sizeof(a[0]))
 #endif
index 45f3c03..e5207e9 100644 (file)
@@ -23,7 +23,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmwifi.h,v 1.29.6.3 2010-08-03 17:47:04 Exp $
+ * $Id: bcmwifi.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index 9661dac..3f3755b 100644 (file)
@@ -25,7 +25,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: dhdioctl.h,v 13.11.10.1 2010-12-22 23:47:26 Exp $
+ * $Id: dhdioctl.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef _dhdioctl_h_
index fe71e16..41a078c 100644 (file)
@@ -19,7 +19,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: epivers.h.in,v 13.32.4.1 2010-09-17 00:39:18 $
+ * $Id: epivers.h.in 277737 2011-08-16 17:54:59Z $
  *
 */
 
 
 #define        EPI_MINOR_VERSION       90
 
-#define        EPI_RC_NUMBER           125
+#define        EPI_RC_NUMBER           195
 
-#define        EPI_INCREMENTAL_NUMBER  94
+#define        EPI_INCREMENTAL_NUMBER  15
 
 #define        EPI_BUILD_NUMBER        0
 
-#define        EPI_VERSION             5, 90, 125, 94
+#define        EPI_VERSION             5, 90, 195, 15
 
-#define        EPI_VERSION_NUM         0x055a7d5e
+#define        EPI_VERSION_NUM         0x055ac30f
 
-#define EPI_VERSION_DEV                5.90.125
+#define EPI_VERSION_DEV                5.90.195
 
 
-#define        EPI_VERSION_STR         "5.90.125.94.1"
+#define        EPI_VERSION_STR         "5.90.195.15"
 
 #endif 
index 51c51b9..69a834c 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: hndpmu.h,v 13.35.8.5 2011-02-11 00:56:32 Exp $
+ * $Id: hndpmu.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef _hndpmu_h_
index 8b9615c..7d862c4 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: hndrte_armtrap.h,v 13.4.14.1 2011-02-05 00:04:30 Exp $
+ * $Id: hndrte_armtrap.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef        _hndrte_armtrap_h
index b9ede53..859ddc8 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: hndrte_cons.h,v 13.4.10.4 2011-02-05 00:08:20 Exp $
+ * $Id: hndrte_cons.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef        _HNDRTE_CONS_H
index 4e26121..34f927c 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: hndsoc.h,v 13.11 2009-12-03 23:52:31 Exp $
+ * $Id: hndsoc.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef        _HNDSOC_H
index 379fbbe..d875edb 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: htsf.h,v 1.1.2.4 2011-01-21 08:27:03 Exp $
+ * $Id: htsf.h 277737 2011-08-16 17:54:59Z $
  */
 #ifndef _HTSF_H_
 #define _HTSF_H_
index 38de298..830d351 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: linux_osl.h,v 13.158.6.3 2010-12-22 23:47:26 Exp $
+ * $Id: linux_osl.h 301794 2011-12-08 20:41:35Z $
  */
 
 
index 96844db..e518982 100644 (file)
@@ -22,7 +22,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: linuxver.h,v 13.53.2.2 2010-12-22 23:47:26 Exp $
+ * $Id: linuxver.h 280266 2011-08-28 04:18:20Z $
  */
 
 
@@ -482,7 +482,11 @@ typedef struct {
 #define DBG_THR(x)
 #endif
 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0))
+#define SMP_RD_BARRIER_DEPENDS(x) smp_read_barrier_depends(x)
+#else
 #define SMP_RD_BARRIER_DEPENDS(x) smp_rmb(x)
+#endif
 
 
 #define PROC_START(thread_func, owner, tsk_ctl, flags) \
index f468420..77eace6 100644 (file)
@@ -20,7 +20,7 @@
  *      Notwithstanding the above, under no circumstances may you combine this
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
- * $Id: miniopt.h,v 1.3 2009-01-15 00:06:54 Exp $
+ * $Id: miniopt.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index 721d421..088f1e8 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: msgtrace.h,v 1.4 2009-04-10 04:15:32 Exp $
+ * $Id: msgtrace.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef        _MSGTRACE_H
index 80248ee..b8cc256 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: osl.h,v 13.44.96.1 2010-05-20 11:09:18 Exp $
+ * $Id: osl.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index 5d4a876..71f8b2e 100644 (file)
@@ -34,7 +34,7 @@
  *      Notwithstanding the above, under no circumstances may you combine this
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
- * $Id: packed_section_end.h,v 1.4 2008-12-09 23:43:22 Exp $
+ * $Id: packed_section_end.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index da2fed6..afc2ba3 100644 (file)
@@ -34,7 +34,7 @@
  *      Notwithstanding the above, under no circumstances may you combine this
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
- * $Id: packed_section_start.h,v 1.4.124.1 2010-09-17 00:47:03 Exp $
+ * $Id: packed_section_start.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index fae063a..6619943 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: pcicfg.h,v 1.50 2009-12-07 21:56:06 Exp $
+ * $Id: pcicfg.h 277737 2011-08-16 17:54:59Z $
  */
 
 
 #define        PCI_INT_MASK            0x94    
 
 #define PCIE_EXTCFG_OFFSET     0x100
+#define        PCI_SPROM_CONTROL       0x88    
+#define        PCI_BAR1_CONTROL        0x8c    
+#define PCI_TO_SB_MB           0x98    
+#define PCI_BACKPLANE_ADDR     0xa0    
+#define PCI_BACKPLANE_DATA     0xa4    
+#define        PCI_CLK_CTL_ST          0xa8    
+#define        PCI_BAR0_WIN2           0xac    
+#define        PCI_GPIO_IN             0xb0    
+#define        PCI_GPIO_OUT            0xb4    
+#define        PCI_GPIO_OUTEN          0xb8    
+
+#define        PCI_BAR0_SHADOW_OFFSET  (2 * 1024)      
+#define        PCI_BAR0_SPROM_OFFSET   (4 * 1024)      
 #define        PCI_BAR0_PCIREGS_OFFSET (6 * 1024)      
 #define        PCI_BAR0_PCISBR_OFFSET  (4 * 1024)      
 
 #define        PCI_16KB0_CCREGS_OFFSET (12 * 1024)     
 #define PCI_16KBB0_WINSZ       (16 * 1024)     
 
+
+#define        PCI_16KB0_WIN2_OFFSET   (4 * 1024)      
+
+
+
+#define SPROM_SZ_MSK           0x02    
+#define SPROM_LOCKED           0x08    
+#define        SPROM_BLANK             0x04    
+#define SPROM_WRITEEN          0x10    
+#define SPROM_BOOTROM_WE       0x20    
+#define SPROM_BACKPLANE_EN     0x40    
+#define SPROM_OTPIN_USE                0x80    
+
 #endif 
index 2342cb3..8850b2d 100644 (file)
@@ -21,7 +21,7 @@
  *
  * Fundamental types and constants relating to 802.11
  *
- * $Id: 802.11.h,v 9.260.2.6 2010-12-15 21:41:14 Exp $
+ * $Id: 802.11.h 289520 2011-10-13 04:44:55Z $
  */
 
 
@@ -429,10 +429,26 @@ typedef struct dot11_obss_chanlist dot11_obss_chanlist_t;
 BWL_PRE_PACKED_STRUCT struct dot11_extcap_ie {
        uint8 id;
        uint8 len;
-       uint8 cap;
+       uint8 cap[1];
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_extcap_ie dot11_extcap_ie_t;
 #define DOT11_EXTCAP_LEN    1
+#define DOT11_EXTCAP_LEN_TDLS  5
+
+BWL_PRE_PACKED_STRUCT struct dot11_extcap {
+       uint8 extcap[DOT11_EXTCAP_LEN_TDLS];
+} 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              
 
 
 
@@ -545,6 +561,9 @@ typedef struct dot11_ibss_dfs dot11_ibss_dfs_t;
 #define WME_SUBTYPE_IE      0   
 #define WME_SUBTYPE_PARAM_IE    1   
 #define WME_SUBTYPE_TSPEC   2   
+#define WME_VERSION_LEN        1
+#define WME_PARAMETER_IE_LEN           24
+
 
 
 #define AC_BE           0   
@@ -709,6 +728,15 @@ BWL_PRE_PACKED_STRUCT struct dot11_management_notification {
 #define DOT11_MGMT_NOTIFICATION_LEN 4   
 
 
+BWL_PRE_PACKED_STRUCT struct ti_ie {
+       uint8 ti_type;
+       uint32 ti_val;
+} BWL_POST_PACKED_STRUCT;
+typedef struct ti_ie ti_ie_t;
+#define TI_TYPE_REASSOC_DEADLINE       1
+#define TI_TYPE_KEY_LIFETIME           2
+
+
 #define WME_ADDTS_REQUEST   0   
 #define WME_ADDTS_RESPONSE  1   
 #define WME_DELTS_REQUEST   2   
@@ -724,8 +752,7 @@ BWL_PRE_PACKED_STRUCT struct dot11_management_notification {
 
 #define DOT11_OPEN_SYSTEM   0   
 #define DOT11_SHARED_KEY    1   
-#define DOT11_OPEN_SHARED   2   
-#define DOT11_FAST_BSS      3   
+#define DOT11_FAST_BSS         2       
 #define DOT11_CHALLENGE_LEN 128 
 
 
@@ -926,9 +953,18 @@ BWL_PRE_PACKED_STRUCT struct dot11_management_notification {
 
 #define DOT11_RC_MAX            23  
 
+#define DOT11_RC_TDLS_PEER_UNREACH     25
+#define DOT11_RC_TDLS_DOWN_UNSPECIFIED 26
+
 
 #define DOT11_SC_SUCCESS        0   
 #define DOT11_SC_FAILURE        1   
+#define DOT11_SC_TDLS_WAKEUP_SCH_ALT 2 
+                                       
+#define DOT11_SC_TDLS_WAKEUP_SCH_REJ 3 
+#define DOT11_SC_TDLS_SEC_DISABLED     5       
+#define DOT11_SC_LIFETIME_REJ          6       
+#define DOT11_SC_NOT_SAME_BSS          7       
 #define DOT11_SC_CAP_MISMATCH       10  
 #define DOT11_SC_REASSOC_FAIL       11  
 #define DOT11_SC_ASSOC_FAIL     12  
@@ -947,13 +983,22 @@ BWL_PRE_PACKED_STRUCT struct dot11_management_notification {
 #define DOT11_SC_ASSOC_SHORTSLOT_REQUIRED   25  
 #define DOT11_SC_ASSOC_ERPBCC_REQUIRED  26  
 #define DOT11_SC_ASSOC_DSSOFDM_REQUIRED 27  
-
-#define DOT11_SC_DECLINED       37  
-#define DOT11_SC_INVALID_PARAMS     38  
-#define DOT11_SC_INVALID_AKMP       43  
-#define DOT11_SC_INVALID_MDID       54  
-#define DOT11_SC_INVALID_FTIE       55  
-
+#define DOT11_SC_ASSOC_R0KH_UNREACHABLE        28      
+#define DOT11_SC_ASSOC_TRY_LATER       30      
+#define DOT11_SC_ASSOC_MFP_VIOLATION   31      
+
+#define        DOT11_SC_DECLINED               37      
+#define        DOT11_SC_INVALID_PARAMS         38      
+#define DOT11_SC_INVALID_PAIRWISE_CIPHER       42 
+#define        DOT11_SC_INVALID_AKMP           43      
+#define DOT11_SC_INVALID_RSNIE_CAP     45      
+#define        DOT11_SC_INVALID_PMKID          53      
+#define        DOT11_SC_INVALID_MDID           54      
+#define        DOT11_SC_INVALID_FTIE           55      
+
+#define DOT11_SC_UNEXP_MSG                     70      
+#define DOT11_SC_INVALID_SNONCE                71      
+#define DOT11_SC_INVALID_RSNIE         72      
 
 #define DOT11_MNG_DS_PARAM_LEN          1   
 #define DOT11_MNG_IBSS_PARAM_LEN        2   
@@ -1008,6 +1053,7 @@ BWL_PRE_PACKED_STRUCT struct dot11_management_notification {
 #define DOT11_MNG_MDIE_ID       54  
 #define DOT11_MNG_FTIE_ID       55  
 #define DOT11_MNG_FT_TI_ID      56  
+#define DOT11_MNG_RDE_ID                       57      
 #define DOT11_MNG_REGCLASS_ID           59  
 #define DOT11_MNG_EXT_CSA_ID            60  
 #define DOT11_MNG_HT_ADD            61  
@@ -1018,7 +1064,13 @@ BWL_PRE_PACKED_STRUCT struct dot11_management_notification {
 #define DOT11_MNG_HT_BSS_COEXINFO_ID        72  
 #define DOT11_MNG_HT_BSS_CHANNEL_REPORT_ID  73  
 #define DOT11_MNG_HT_OBSS_ID            74  
-#define DOT11_MNG_EXT_CAP           127 
+#define DOT11_MNG_CHANNEL_USAGE                        97 
+#define DOT11_MNG_LINK_IDENTIFIER_ID   101     
+#define DOT11_MNG_WAKEUP_SCHEDULE_ID   102 
+#define DOT11_MNG_CHANNEL_SWITCH_TIMING_ID     104 
+#define DOT11_MNG_PTI_CONTROL_ID               105     
+#define DOT11_MNG_PU_BUFFER_STATUS_ID  106     
+#define DOT11_MNG_EXT_CAP_ID           127 
 #define DOT11_MNG_WPA_ID            221 
 #define DOT11_MNG_PROPR_ID          221 
 
@@ -1070,8 +1122,14 @@ BWL_PRE_PACKED_STRUCT struct dot11_management_notification {
 #define DOT11_ACTION_CAT_RRM        5   
 #define DOT11_ACTION_CAT_FBT    6   
 #define DOT11_ACTION_CAT_HT     7   
+#if defined(MFP) || defined(WLFBT) || defined(WLWNM)
+#define        DOT11_ACTION_CAT_SA_QUERY       8       
+#define        DOT11_ACTION_CAT_PDPA           9       
 #define DOT11_ACTION_CAT_BSSMGMT    10  
 #define DOT11_ACTION_NOTIFICATION   17
+#define DOT11_ACTION_CAT_VSP           126     
+#endif 
+#define DOT11_ACTION_NOTIFICATION      17
 #define DOT11_ACTION_CAT_VS     127 
 
 
@@ -1107,6 +1165,121 @@ BWL_PRE_PACKED_STRUCT struct dot11_management_notification {
 #define DOT11_ADDBA_POLICY_DELAYED  0   
 #define DOT11_ADDBA_POLICY_IMMEDIATE    1   
 
+
+#define DOT11_FT_ACTION_FT_RESERVED            0
+#define DOT11_FT_ACTION_FT_REQ                 1       
+#define DOT11_FT_ACTION_FT_RES                 2       
+#define DOT11_FT_ACTION_FT_CON                 3       
+#define DOT11_FT_ACTION_FT_ACK                 4       
+
+
+
+#define DOT11_WNM_ACTION_EVENT_REQ                     0
+#define DOT11_WNM_ACTION_EVENT_REP                     1
+#define DOT11_WNM_ACTION_DIAG_REQ                      2
+#define DOT11_WNM_ACTION_DIAG_REP                      3
+#define DOT11_WNM_ACTION_LOC_CFG_REQ           4
+#define DOT11_WNM_ACTION_LOC_RFG_RESP          5
+#define DOT11_WNM_ACTION_BSS_TRANS_QURY                6
+#define DOT11_WNM_ACTION_BSS_TRANS_REQ         7
+#define DOT11_WNM_ACTION_BSS_TRANS_RESP                8
+#define DOT11_WNM_ACTION_FMS_REQ                       9
+#define DOT11_WNM_ACTION_FMS_RESP                      10
+#define DOT11_WNM_ACTION_COL_INTRFRNCE_REQ     11
+#define DOT11_WNM_ACTION_COL_INTRFRNCE_REP     12
+#define DOT11_WNM_ACTION_TFS_REQ                       13
+#define DOT11_WNM_ACTION_TFS_RESP                      14
+#define DOT11_WNM_ACTION_TFS_NOTIFY                    15
+#define DOT11_WNM_ACTION_WNM_SLEEP_REQ         16
+#define DOT11_WNM_ACTION_WNM_SLEEP_RESP                17
+#define DOT11_WNM_ACTION_TIM_BCAST_REQ         18
+#define DOT11_WNM_ACTION_TIM_BCAST_RESP                19
+#define DOT11_WNM_ACTION_QOS_TRFC_CAP_UPD      20
+#define DOT11_WNM_ACTION_CHAN_USAGE_REQ                21
+#define DOT11_WNM_ACTION_CHAN_USAGE_RESP       22
+#define DOT11_WNM_ACTION_DMS_REQ                       23
+#define DOT11_WNM_ACTION_DMS_RESP                      24
+#define DOT11_WNM_ACTION_TMNG_MEASUR_REQ       25
+#define DOT11_WNM_ACTION_NOTFCTN_REQ           26
+#define DOT11_WNM_ACTION_NOTFCTN_RES           27
+
+
+
+BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_query {
+       uint8 category;                         
+       uint8 action;                           
+       uint8 token;                            
+       uint8 reason;                           
+       uint8 data[1];                          
+} BWL_POST_PACKED_STRUCT;
+typedef struct dot11_bss_trans_query dot11_bss_trans_query_t;
+#define DOT11_BSS_TRANS_QUERY_LEN 4    
+
+
+BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_req {
+       uint8 category;                         
+       uint8 action;                           
+       uint8 token;                            
+       uint8 reqmode;                          
+       uint16 disassoc_tmr;            
+       uint8 validity_intrvl;          
+       uint8 data[1];                          
+                                                               
+} BWL_POST_PACKED_STRUCT;
+typedef struct dot11_bss_trans_req dot11_bss_trans_req_t;
+#define DOT11_BSS_TRANS_REQ_LEN 7      
+
+#define DOT11_BSS_TERM_DUR_LEN 12      
+
+
+
+#define DOT11_BSS_TRNS_REQMODE_PREF_LIST_INCL          0x01
+#define DOT11_BSS_TRNS_REQMODE_ABRIDGED                                0x02
+#define DOT11_BSS_TRNS_REQMODE_DISASSOC_IMMINENT       0x04
+#define DOT11_BSS_TRNS_REQMODE_BSS_TERM_INCL           0x08
+#define DOT11_BSS_TRNS_REQMODE_ESS_DISASSOC_IMNT       0x10
+
+
+
+BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_res {
+       uint8 category;                         
+       uint8 action;                           
+       uint8 token;                            
+       uint8 status;                           
+       uint8 term_delay;                       
+       uint8 data[1];                          
+                                                               
+} BWL_POST_PACKED_STRUCT;
+typedef struct dot11_bss_trans_res dot11_bss_trans_res_t;
+#define DOT11_BSS_TRANS_RES_LEN 5      
+
+
+#define DOT11_BSS_TRNS_RES_STATUS_ACCEPT                               0
+#define DOT11_BSS_TRNS_RES_STATUS_REJECT                               1
+#define DOT11_BSS_TRNS_RES_STATUS_REJ_INSUFF_BCN               2
+#define DOT11_BSS_TRNS_RES_STATUS_REJ_INSUFF_CAP               3
+#define DOT11_BSS_TRNS_RES_STATUS_REJ_TERM_UNDESIRED   4
+#define DOT11_BSS_TRNS_RES_STATUS_REJ_TERM_DELAY_REQ   5
+#define DOT11_BSS_TRNS_RES_STATUS_REJ_BSS_LIST_PROVIDED        6
+#define DOT11_BSS_TRNS_RES_STATUS_REJ_NO_SUITABLE_BSS  7
+#define DOT11_BSS_TRNS_RES_STATUS_REJ_LEAVING_ESS              8
+
+
+
+#define DOT11_NBR_RPRT_BSSID_INFO_REACHABILTY          0x0003
+#define DOT11_NBR_RPRT_BSSID_INFO_SEC                          0x0004
+#define DOT11_NBR_RPRT_BSSID_INFO_KEY_SCOPE                    0x0008
+#define DOT11_NBR_RPRT_BSSID_INFO_CAP                          0x03f0
+
+#define DOT11_NBR_RPRT_BSSID_INFO_CAP_SPEC_MGMT                0x0010
+#define DOT11_NBR_RPRT_BSSID_INFO_CAP_QOS                      0x0020
+#define DOT11_NBR_RPRT_BSSID_INFO_CAP_APSD                     0x0040
+#define DOT11_NBR_RPRT_BSSID_INFO_CAP_RDIO_MSMT                0x0080
+#define DOT11_NBR_RPRT_BSSID_INFO_CAP_DEL_BA           0x0100
+#define DOT11_NBR_RPRT_BSSID_INFO_CAP_IMM_BA           0x0200
+
+
+#define DOT11_NBR_RPRT_SUBELEM_BSS_CANDDT_PREF_ID      3
 BWL_PRE_PACKED_STRUCT struct dot11_addba_req {
        uint8 category;             
        uint8 action;               
@@ -1145,6 +1318,48 @@ typedef struct dot11_delba dot11_delba_t;
 #define DOT11_DELBA_LEN         6   
 
 
+#define SA_QUERY_REQUEST               0
+#define SA_QUERY_RESPONSE              1
+
+
+
+
+BWL_PRE_PACKED_STRUCT struct dot11_ft_req {
+       uint8 category;                 
+       uint8 action;                   
+       uint8 sta_addr[ETHER_ADDR_LEN];
+       uint8 tgt_ap_addr[ETHER_ADDR_LEN];
+       uint8 data[1];                  
+} BWL_POST_PACKED_STRUCT;
+typedef struct dot11_ft_req dot11_ft_req_t;
+#define DOT11_FT_REQ_FIXED_LEN 14
+
+
+BWL_PRE_PACKED_STRUCT struct dot11_ft_res {
+       uint8 category;                 
+       uint8 action;                   
+       uint8 sta_addr[ETHER_ADDR_LEN];
+       uint8 tgt_ap_addr[ETHER_ADDR_LEN];
+       uint16 status;                  
+       uint8 data[1];                  
+} BWL_POST_PACKED_STRUCT;
+typedef struct dot11_ft_res dot11_ft_res_t;
+#define DOT11_FT_RES_FIXED_LEN 16
+
+
+BWL_PRE_PACKED_STRUCT struct dot11_rde_ie {
+       uint8 id;                       
+       uint8 length;
+       uint8 rde_id;                   
+       uint8 rd_count;                 
+       uint16 status;                  
+} BWL_POST_PACKED_STRUCT;
+typedef struct dot11_rde_ie dot11_rde_ie_t;
+
+
+#define DOT11_MNG_RDE_IE_LEN sizeof(dot11_rde_ie_t)
+
+
 
 
 
@@ -1166,6 +1381,20 @@ typedef struct dot11_rrm_cap_ie dot11_rrm_cap_ie_t;
 #define DOT11_RRM_CAP_AP_CHANREP    16
 
 
+
+#define DOT11_EXT_CAP_LEN              4       
+BWL_PRE_PACKED_STRUCT struct dot11_ext_cap_ie {
+       uint8 cap[DOT11_EXT_CAP_LEN];
+} BWL_POST_PACKED_STRUCT;
+typedef struct dot11_ext_cap_ie dot11_ext_cap_ie_t;
+
+
+#define DOT11_EXT_CAP_BSS_TRANSITION_MGMT      19
+
+
+#define DOT11_OP_CLASS_NONE                    255
+
+
 #define DOT11_RM_ACTION_RM_REQ      0   
 #define DOT11_RM_ACTION_RM_REP      1   
 #define DOT11_RM_ACTION_LM_REQ      2   
@@ -1272,6 +1501,7 @@ BWL_PRE_PACKED_STRUCT struct dot11_rmrep_nbr {
        uint8 reg;
        uint8 channel;
        uint8 phytype;
+       uchar sub_elements[1];  
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_rmrep_nbr dot11_rmrep_nbr_t;
 #define DOT11_RMREP_NBR_LEN 13
@@ -1660,6 +1890,9 @@ typedef struct dot11_obss_ie dot11_obss_ie_t;
 #define RSN_AKM_PSK     2   
 #define RSN_AKM_FBT_1X      3   
 #define RSN_AKM_FBT_PSK     4   
+#define RSN_AKM_MFP_1X         5       
+#define RSN_AKM_MFP_PSK                6       
+#define RSN_AKM_TPK                    7       
 
 
 #define DOT11_MAX_DEFAULT_KEYS  4   
@@ -1724,6 +1957,66 @@ BWL_PRE_PACKED_STRUCT struct dot11_gtk_ie {
 } BWL_POST_PACKED_STRUCT;
 typedef struct dot11_gtk_ie dot11_gtk_ie_t;
 
+#define BSSID_INVALID           "\x00\x00\x00\x00\x00\x00"
+#define BSSID_BROADCAST         "\xFF\xFF\xFF\xFF\xFF\xFF"
+
+
+
+BWL_PRE_PACKED_STRUCT struct link_id_ie {
+       uint8 id;
+       uint8 len;
+       struct ether_addr       bssid;
+       struct ether_addr       tdls_init_mac;
+       struct ether_addr       tdls_resp_mac;
+} BWL_POST_PACKED_STRUCT;
+typedef struct link_id_ie link_id_ie_t;
+#define TDLS_LINK_ID_IE_LEN            18
+
+
+BWL_PRE_PACKED_STRUCT struct wakeup_sch_ie {
+       uint8 id;
+       uint8 len;
+       uint32 offset;                  
+       uint32 interval;                
+       uint32 awake_win_slots; 
+       uint32 max_wake_win;    
+       uint16 idle_cnt;                
+} BWL_POST_PACKED_STRUCT;
+typedef struct wakeup_sch_ie wakeup_sch_ie_t;
+#define TDLS_WAKEUP_SCH_IE_LEN         18
+
+
+BWL_PRE_PACKED_STRUCT struct channel_switch_timing_ie {
+       uint8 id;
+       uint8 len;
+       uint16 switch_time;             
+       uint16 switch_timeout;  
+} BWL_POST_PACKED_STRUCT;
+typedef struct channel_switch_timing_ie channel_switch_timing_ie_t;
+#define TDLS_CHANNEL_SWITCH_TIMING_IE_LEN              4
+
+
+BWL_PRE_PACKED_STRUCT struct pti_control_ie {
+       uint8 id;
+       uint8 len;
+       uint8 tid;
+       uint16 seq_control;
+} BWL_POST_PACKED_STRUCT;
+typedef struct pti_control_ie pti_control_ie_t;
+#define TDLS_PTI_CONTROL_IE_LEN                3
+
+
+BWL_PRE_PACKED_STRUCT struct pu_buffer_status_ie {
+       uint8 id;
+       uint8 len;
+       uint8 status;
+} BWL_POST_PACKED_STRUCT;
+typedef struct pu_buffer_status_ie pu_buffer_status_ie_t;
+#define TDLS_PU_BUFFER_STATUS_IE_LEN   1
+#define TDLS_PU_BUFFER_STATUS_AC_BK            1
+#define TDLS_PU_BUFFER_STATUS_AC_BE            2
+#define TDLS_PU_BUFFER_STATUS_AC_VI            4
+#define TDLS_PU_BUFFER_STATUS_AC_VO            8
 
 
 #include <packed_section_end.h>
index 4ccfab0..cbdd05e 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: 802.11_bta.h,v 9.2 2008-10-28 23:27:13 Exp $
+ * $Id: 802.11_bta.h 277737 2011-08-16 17:54:59Z $
 */
 
 #ifndef _802_11_BTA_H_
index ce8ad08..0e070a4 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: 802.11e.h,v 1.6 2008-12-01 22:55:11 Exp $
+ * $Id: 802.11e.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef _802_11e_H_
index cf20625..c7e07bd 100644 (file)
@@ -21,7 +21,7 @@
  *
  * Fundamental types and constants relating to 802.1D
  *
- * $Id: 802.1d.h,v 9.3 2007-04-10 21:33:06 Exp $
+ * $Id: 802.1d.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index 46fa4c9..0f75d3c 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bcmeth.h,v 9.12 2009-12-29 19:57:18 Exp $
+ * $Id: bcmeth.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index 30ec848..e8c2387 100644 (file)
@@ -23,7 +23,7 @@
  *
  * Dependencies: proto/bcmeth.h
  *
- * $Id: bcmevent.h,v 9.64.2.9 2011-02-01 06:24:21 Exp $
+ * $Id: bcmevent.h 288077 2011-10-06 00:08:47Z $
  *
  */
 
@@ -182,7 +182,10 @@ typedef BWL_PRE_PACKED_STRUCT struct bcm_event {
 #define WLC_E_PFN_SCAN_NONE            82      
 #define WLC_E_PFN_SCAN_ALLGONE 83      
 #define WLC_E_GTK_PLUMBED 84
-#define WLC_E_LAST     85
+#define WLC_E_ASSOC_REQ_IE 85
+#define WLC_E_ASSOC_RESP_IE 86
+#define WLC_E_LAST     87      
+
 
 
 typedef struct {
@@ -226,6 +229,8 @@ extern const int            bcmevent_names_size;
 #define WLC_E_REASON_TSPEC_REJECTED    7       
 #define WLC_E_REASON_BETTER_AP         8       
 
+#define WLC_E_REASON_REQUESTED_ROAM 11 
+
 
 #define WLC_E_PRUNE_ENCR_MISMATCH      1       
 #define WLC_E_PRUNE_BCAST_BSSID                2       
index 8a8f314..55eff24 100644 (file)
@@ -21,7 +21,7 @@
  *
  * Fundamental constants relating to IP Protocol
  *
- * $Id: bcmip.h,v 9.19 2009-11-10 20:08:33 Exp $
+ * $Id: bcmip.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index 89c1181..91ab4fe 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: bt_amp_hci.h,v 9.14.8.2 2010-09-10 18:37:47 Exp $
+ * $Id: bt_amp_hci.h 277737 2011-08-16 17:54:59Z $
 */
 
 #ifndef _bt_amp_hci_h
index 5781d13..92634c1 100644 (file)
@@ -7,7 +7,7 @@
  *
  * Copyright (C) 2002 Broadcom Corporation
  *
- * $Id: eapol.h,v 9.23.86.1 2010-09-02 18:09:39 Exp $
+ * $Id: eapol.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef _eapol_h_
index 6a6dd14..20865dc 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: ethernet.h,v 9.56 2009-10-15 22:54:58 Exp $
+ * $Id: ethernet.h 285437 2011-09-21 22:16:56Z $
  */
 
 
@@ -69,6 +69,7 @@
 #define        ETHER_TYPE_802_1X       0x888e          
 #define        ETHER_TYPE_802_1X_PREAUTH 0x88c7        
 #define ETHER_TYPE_WAI         0x88b4          
+#define ETHER_TYPE_89_0D       0x890d          
 
 
 
index 4a0c9d1..d2bf3f2 100644 (file)
@@ -21,7 +21,7 @@
  *
  * Fundamental types and constants relating to WFA P2P (aka WiFi Direct)
  *
- * $Id: p2p.h,v 9.17.2.4 2010-12-15 21:41:21 Exp $
+ * $Id: p2p.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef _P2P_H_
index 7fe4fbc..7353ff0 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: sdspi.h,v 9.2.120.1 2010-11-15 17:56:25 Exp $
+ * $Id: sdspi.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef        _SD_SPI_H
index 07fa7e4..27f0055 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: vlan.h,v 9.7 2009-03-13 01:11:50 Exp $
+ * $Id: vlan.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index 1ff06dc..7361cbf 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: wpa.h,v 1.19 2009-07-13 08:29:58 Exp $
+ * $Id: wpa.h 285437 2011-09-21 22:16:56Z $
  */
 
 
@@ -114,6 +114,8 @@ typedef BWL_PRE_PACKED_STRUCT struct
 #define WPA_CIPHER_AES_OCB     3       
 #define WPA_CIPHER_AES_CCM     4       
 #define WPA_CIPHER_WEP_104     5       
+#define WPA_CIPHER_BIP         6       
+#define WPA_CIPHER_TPK         7       
 
 
 #define IS_WPA_CIPHER(cipher)  ((cipher) == WPA_CIPHER_NONE || \
@@ -121,7 +123,9 @@ typedef BWL_PRE_PACKED_STRUCT struct
                                 (cipher) == WPA_CIPHER_WEP_104 || \
                                 (cipher) == WPA_CIPHER_TKIP || \
                                 (cipher) == WPA_CIPHER_AES_OCB || \
-                                (cipher) == WPA_CIPHER_AES_CCM)
+                                (cipher) == WPA_CIPHER_AES_CCM || \
+                                (cipher) == WPA_CIPHER_TPK)
+
 
 
 #define WPA_TKIP_CM_DETECT     60      
@@ -149,7 +153,11 @@ typedef BWL_PRE_PACKED_STRUCT struct
 #define WPA_CAP_REPLAY_CNTR_MASK       RSN_CAP_PTK_REPLAY_CNTR_MASK
 
 
+#define WPA_CAP_PEER_KEY_ENABLE                (0x1 << 1)      
+
+
 #define WPA_CAP_LEN    RSN_CAP_LEN     
+#define WPA_PMKID_CNT_LEN      2       
 
 #define        WPA_CAP_WPA2_PREAUTH            RSN_CAP_PREAUTH
 
index cbd3749..3fe2a5a 100644 (file)
@@ -5,7 +5,7 @@
  * JTAG, 0/1/2 UARTs, clock frequency control, a watchdog interrupt timer,
  * GPIO interface, extbus, and support for serial and parallel flashes.
  *
- * $Id: sbchipc.h,v 13.169.2.14 2011-02-10 23:43:55 Exp $
+ * $Id: sbchipc.h 277737 2011-08-16 17:54:59Z $
  *
  * Copyright (C) 1999-2011, Broadcom Corporation
  * 
 #define        PAD             _XSTR(__LINE__)
 #endif 
 
+typedef struct eci_prerev35 {
+       uint32  eci_output;
+       uint32  eci_control;
+       uint32  eci_inputlo;
+       uint32  eci_inputmi;
+       uint32  eci_inputhi;
+       uint32  eci_inputintpolaritylo;
+       uint32  eci_inputintpolaritymi;
+       uint32  eci_inputintpolarityhi;
+       uint32  eci_intmasklo;
+       uint32  eci_intmaskmi;
+       uint32  eci_intmaskhi;
+       uint32  eci_eventlo;
+       uint32  eci_eventmi;
+       uint32  eci_eventhi;
+       uint32  eci_eventmasklo;
+       uint32  eci_eventmaskmi;
+       uint32  eci_eventmaskhi;
+       uint32  PAD[3];
+} eci_prerev35_t;
+
+typedef struct eci_rev35 {
+       uint32  eci_outputlo;
+       uint32  eci_outputhi;
+       uint32  eci_controllo;
+       uint32  eci_controlhi;
+       uint32  eci_inputlo;
+       uint32  eci_inputhi;
+       uint32  eci_inputintpolaritylo;
+       uint32  eci_inputintpolarityhi;
+       uint32  eci_intmasklo;
+       uint32  eci_intmaskhi;
+       uint32  eci_eventlo;
+       uint32  eci_eventhi;
+       uint32  eci_eventmasklo;
+       uint32  eci_eventmaskhi;
+       uint32  eci_auxtx;
+       uint32  eci_auxrx;
+       uint32  eci_datatag;
+       uint32  eci_uartescvalue;
+       uint32  eci_autobaudctr;
+       uint32  eci_uartfifolevel;
+} eci_rev35_t;
+
 typedef volatile struct {
        uint32  chipid;                 
        uint32  capabilities;
@@ -153,10 +197,26 @@ typedef volatile struct {
        uint32  prog_waitcount;
        uint32  flash_config;
        uint32  flash_waitcount;
-       uint32  PAD[4];
-       uint32  PAD[40];
+       uint32  SECI_config;            
+       uint32  SECI_status;
+       uint32  SECI_statusmask;
+       uint32  SECI_rxnibchanged;
+
+       uint32  PAD[20];
 
        
+       uint32  sromcontrol;            
+       uint32  sromaddress;
+       uint32  sromdata;
+       uint32  PAD[9];         
+       uint32  seci_uart_data;         
+       uint32  seci_uart_bauddiv;
+       uint32  seci_uart_fcr;
+       uint32  seci_uart_lcr;
+       uint32  seci_uart_mcr;
+       uint32  seci_uart_lsr;
+       uint32  seci_uart_msr;
+       uint32  seci_uart_baudadj;
        
        uint32  clk_ctl_st;             
        uint32  hw_war;
@@ -1332,9 +1392,27 @@ typedef volatile struct {
 #define CST43237_BOOT_FROM_INVALID     3
 
 
+#define RES43239_CBUCK_LPOM            0
+#define RES43239_CBUCK_BURST           1
+#define RES43239_CBUCK_LP_PWM          2
+#define RES43239_CBUCK_PWM             3
+#define RES43239_CLDO_PU               4
+#define RES43239_DIS_INT_RESET_PD      5
+#define RES43239_ILP_REQUEST           6
+#define RES43239_LNLDO_PU              7
+#define RES43239_LDO3P3_PU             8
 #define RES43239_OTP_PU                        9
+#define RES43239_XTAL_PU               10
+#define RES43239_ALP_AVAIL             11
+#define RES43239_RADIO_PU              12
 #define RES43239_MACPHY_CLKAVAIL       23
 #define RES43239_HT_AVAIL              24
+#define RES43239_XOLDO_PU              25
+#define RES43239_WL_XTAL_CTL_SEL       26
+#define RES43239_SR_CLK_STABLE         27
+#define RES43239_SR_SAVE_RESTORE       28
+#define RES43239_SR_PHY_PIC            29
+#define RES43239_SR_PHY_PWR_SW         30
 
 
 #define CST43239_SPROM_MASK                    0x00000002
@@ -1342,7 +1420,7 @@ typedef volatile struct {
 #define        CST43239_RES_INIT_MODE_SHIFT    7
 #define        CST43239_RES_INIT_MODE_MASK             0x000001f0
 #define CST43239_CHIPMODE_SDIOD(cs)    ((cs) & (1 << 15))      
-#define CST43239_CHIPMODE_USB20D(cs)   ((cs) & !(1 << 15))     
+#define CST43239_CHIPMODE_USB20D(cs)   (~(cs) & (1 << 15))     
 #define CST43239_CHIPMODE_SDIO(cs)     (((cs) & (1 << 0)) == 0)        
 #define CST43239_CHIPMODE_GSPI(cs)     (((cs) & (1 << 0)) == (1 << 0)) 
 
@@ -1350,6 +1428,40 @@ typedef volatile struct {
 #define CCTRL43239_XTAL_STRENGTH(ctl)  ((ctl & 0x3F) << 12)
 
 
+#define RES4331_REGULATOR              0
+#define RES4331_ILP_REQUEST            1
+#define RES4331_XTAL_PU                        2
+#define RES4331_ALP_AVAIL              3
+#define RES4331_SI_PLL_ON              4
+#define RES4331_HT_SI_AVAIL            5
+
+
+#define CCTRL4331_BT_COEXIST           (1<<0)  
+#define CCTRL4331_SECI                 (1<<1)  
+#define CCTRL4331_EXT_LNA_G            (1<<2)  
+#define CCTRL4331_SPROM_GPIO13_15       (1<<3)  
+#define CCTRL4331_EXTPA_EN             (1<<4)  
+#define CCTRL4331_GPIOCLK_ON_SPROMCS   <1<<5)  
+#define CCTRL4331_PCIE_MDIO_ON_SPROMCS (1<<6)  
+#define CCTRL4331_EXTPA_ON_GPIO2_5     (1<<7)  
+#define CCTRL4331_OVR_PIPEAUXCLKEN     (1<<8)  
+#define CCTRL4331_OVR_PIPEAUXPWRDOWN   (1<<9)  
+#define CCTRL4331_PCIE_AUXCLKEN                <1<<10) 
+#define CCTRL4331_PCIE_PIPE_PLLDOWN    <1<<11) 
+#define CCTRL4331_EXTPA_EN2            (1<<12) 
+#define CCTRL4331_EXT_LNA_A            (1<<13) 
+#define CCTRL4331_BT_SHD0_ON_GPIO4     <1<<16) 
+#define CCTRL4331_BT_SHD1_ON_GPIO5     <1<<17) 
+#define CCTRL4331_EXTPA_ANA_EN         (1<<24) 
+
+
+#define        CST4331_XTAL_FREQ               0x00000001      
+#define        CST4331_SPROM_OTP_SEL_MASK      0x00000006
+#define        CST4331_SPROM_OTP_SEL_SHIFT     1
+#define        CST4331_SPROM_PRESENT           0x00000002
+#define        CST4331_OTP_PRESENT             0x00000004
+#define        CST4331_LDO_RF                  0x00000008
+#define        CST4331_LDO_PAR                 0x00000010
 
 
 #define RES4315_CBUCK_LPOM             1       
@@ -1597,6 +1709,54 @@ typedef volatile struct {
 
 
 
+#define SECI_MODE_UART                 0x0
+#define SECI_MODE_SECI                 0x1
+#define SECI_MODE_LEGACY_3WIRE_BT      0x2
+#define SECI_MODE_LEGACY_3WIRE_WLAN    0x3
+#define SECI_MODE_HALF_SECI            0x4
+
+#define SECI_RESET             (1 << 0)
+#define SECI_RESET_BAR_UART    (1 << 1)
+#define SECI_ENAB_SECI_ECI     (1 << 2)
+#define SECI_ENAB_SECIOUT_DIS  (1 << 3)
+#define SECI_MODE_MASK         0x7
+#define SECI_MODE_SHIFT                4 
+#define SECI_UPD_SECI          (1 << 7)
+
+
+#define CLKCTL_STS_SECI_CLK_REQ                (1 << 8)
+#define CLKCTL_STS_SECI_CLK_AVAIL      (1 << 24)
+
+#define SECI_UART_MSR_CTS_STATE                (1 << 0)
+#define SECI_UART_MSR_RTS_STATE                (1 << 1)
+#define SECI_UART_SECI_IN_STATE                (1 << 2)
+#define SECI_UART_SECI_IN2_STATE       (1 << 3)
+
+
+#define SECI_UART_LCR_STOP_BITS                (1 << 0) 
+#define SECI_UART_LCR_PARITY_EN                (1 << 1)
+#define SECI_UART_LCR_PARITY           (1 << 2) 
+#define SECI_UART_LCR_RX_EN            (1 << 3)
+#define SECI_UART_LCR_LBRK_CTRL                (1 << 4) 
+#define SECI_UART_LCR_TXO_EN           (1 << 5)
+#define SECI_UART_LCR_RTSO_EN          (1 << 6)
+#define SECI_UART_LCR_SLIPMODE_EN      (1 << 7)
+#define SECI_UART_LCR_RXCRC_CHK                (1 << 8)
+#define SECI_UART_LCR_TXCRC_INV                (1 << 9)
+#define SECI_UART_LCR_TXCRC_LSBF       (1 << 10)
+#define SECI_UART_LCR_TXCRC_EN         (1 << 11)
+
+#define SECI_UART_MCR_TX_EN            (1 << 0)
+#define SECI_UART_MCR_PRTS             (1 << 1)
+#define SECI_UART_MCR_SWFLCTRL_EN      (1 << 2)
+#define SECI_UART_MCR_HIGHRATE_EN      (1 << 3)
+#define SECI_UART_MCR_LOOPBK_EN                (1 << 4)
+#define SECI_UART_MCR_AUTO_RTS         (1 << 5)
+#define SECI_UART_MCR_AUTO_TX_DIS      (1 << 6)
+#define SECI_UART_MCR_BAUD_ADJ_EN      (1 << 7)
+#define SECI_UART_MCR_XONOFF_RPT       (1 << 9)
+
+
 
 
 #define ECI_BW_20   0x0
index 76f05ae..f45351a 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: sbconfig.h,v 13.70 2008-03-28 19:17:04 Exp $
+ * $Id: sbconfig.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index 05d0587..77c413f 100644 (file)
@@ -22,7 +22,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: sbhnddma.h,v 13.20.2.3 2010-10-14 22:21:29 Exp $
+ * $Id: sbhnddma.h 278779 2011-08-19 22:07:18Z $
  */
 
 
@@ -217,7 +217,7 @@ typedef volatile struct {
 #define D64_XC_BL_SHIFT                18
 
 
-#define        D64_XP_LD_MASK          0x00000fff      
+#define        D64_XP_LD_MASK          0x00001fff      
 
 
 #define        D64_XS0_CD_MASK         0x00001fff      
@@ -260,7 +260,7 @@ typedef volatile struct {
 #define DMA_CTRL_USB_BOUNDRY4KB_WAR (1 << 4)
 
 
-#define        D64_RP_LD_MASK          0x00000fff      
+#define        D64_RP_LD_MASK          0x00001fff      
 
 
 #define        D64_RS0_CD_MASK         0x00001fff      
index aba914b..d84f69a 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: sbpcmcia.h,v 13.48.12.6 2010-11-04 09:39:42 Exp $
+ * $Id: sbpcmcia.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index 4280d5b..7aaeb73 100644 (file)
@@ -24,7 +24,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: sbsdio.h,v 13.34 2009-03-11 20:27:16 Exp $
+ * $Id: sbsdio.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef        _SBSDIO_H
index 107a8b0..e517648 100644 (file)
@@ -22,7 +22,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: sbsdpcmdev.h,v 13.38 2009-09-22 22:56:45 Exp $
+ * $Id: sbsdpcmdev.h 282638 2011-09-08 21:18:10Z $
  */
 
 #ifndef        _sbsdpcmdev_h_
index 1cba422..45c4dc2 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: sbsocram.h,v 13.15 2009-10-02 16:55:44 Exp $
+ * $Id: sbsocram.h 277737 2011-08-16 17:54:59Z $
  */
 
 
index ca93226..c8ac7b7 100644 (file)
@@ -22,7 +22,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: sdio.h,v 13.27.14.1 2010-09-07 13:37:45 Exp $
+ * $Id: sdio.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef        _SDIO_H
@@ -366,7 +366,7 @@ typedef volatile struct {
  *  SDIO Commands and responses
  *
  *  I/O only commands are:
- *      CMD0, CMD3, CMD5, CMD7, CMD15, CMD52, CMD53
+ *      CMD0, CMD3, CMD5, CMD7, CMD14, CMD15, CMD52, CMD53
  * ------------------------------------------------
  */
 
@@ -412,6 +412,7 @@ typedef volatile struct {
 
 #define CMD7_RCA_M             BITFIELD_MASK(16)
 #define CMD7_RCA_S             16
+
 #define CMD14_RCA_M            BITFIELD_MASK(16)
 #define CMD14_RCA_S            16
 #define CMD14_SLEEP_M          BITFIELD_MASK(1)
index 3d37c7a..5f47d6f 100644 (file)
@@ -22,7 +22,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: sdioh.h,v 13.17.2.3 2011-01-08 05:28:21 Exp $
+ * $Id: sdioh.h 300017 2011-12-01 20:30:27Z $
  */
 
 #ifndef        _SDIOH_H
 #define SD_ADMA_SysAddr                        0x58
 #define SD_SlotInterruptStatus         0x0FC
 #define SD_HostControllerVersion       0x0FE
+#define        SD_GPIO_Reg                     0x100
+#define        SD_GPIO_OE                      0x104
+#define        SD_GPIO_Enable                  0x108
+
 
 /* SD specific registers in PCI config space */
 #define SD_SlotInfo    0x40
 /* SD_SlotInterruptStatus: Offset 0x0FC , size = bytes */
 /* SD_HostControllerVersion : Offset 0x0FE , size = bytes */
 
+/* SDIO Host Control Register DMA Mode Definitions */
+#define SDIOH_SDMA_MODE                        0
+#define SDIOH_ADMA1_MODE               1
+#define SDIOH_ADMA2_MODE               2
+#define SDIOH_ADMA2_64_MODE            3
+
+#define ADMA2_ATTRIBUTE_VALID          (1 << 0)        /* ADMA Descriptor line valid */
+#define ADMA2_ATTRIBUTE_END                    (1 << 1)        /* End of Descriptor */
+#define ADMA2_ATTRIBUTE_INT                    (1 << 2)        /* Interrupt when line is done */
+#define ADMA2_ATTRIBUTE_ACT_NOP                (0 << 4)        /* Skip current line, go to next. */
+#define ADMA2_ATTRIBUTE_ACT_RSV                (1 << 4)        /* Same as NOP */
+#define ADMA1_ATTRIBUTE_ACT_SET                (1 << 4)        /* ADMA1 Only - set transfer length */
+#define ADMA2_ATTRIBUTE_ACT_TRAN       (2 << 4)        /* Transfer Data of one descriptor line. */
+#define ADMA2_ATTRIBUTE_ACT_LINK       (3 << 4)        /* Link Descriptor */
+
+/* ADMA2 Descriptor Table Entry for 32-bit Address */
+typedef struct adma2_dscr_32b {
+       uint32 len_attr;
+       uint32 phys_addr;
+} adma2_dscr_32b_t;
+
+/* ADMA1 Descriptor Table Entry */
+typedef struct adma1_dscr {
+       uint32 phys_addr_attr;
+} adma1_dscr_t;
+
 #endif /* _SDIOH_H */
index 2c5bcf9..55a3d34 100644 (file)
@@ -22,7 +22,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: sdiovar.h,v 13.9 2009-12-08 22:30:15 Exp $
+ * $Id: sdiovar.h 277737 2011-08-16 17:54:59Z $
  */
 
 #ifndef _sdiovar_h_
index c5a3383..6a7b93c 100644 (file)
@@ -22,7 +22,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: siutils.h,v 13.251.2.10 2011-02-04 05:06:32 Exp $
+ * $Id: siutils.h 285387 2011-09-21 18:38:37Z $
  */
 
 
@@ -60,6 +60,7 @@ struct si_pub {
 typedef const struct si_pub si_t;
 
 
+
 #define        SI_OSH          NULL    
 
 #define        BADIDX          (SI_MAXCORES + 1)
@@ -213,8 +214,34 @@ extern int si_corepciid(si_t *sih, uint func, uint16 *pcivendor, uint16 *pcidevi
 #define si_eci(sih) 0
 #define si_eci_init(sih) (0)
 #define si_eci_notify_bt(sih, type, val)  (0)
+#define si_seci(sih) 0
+static INLINE void * si_seci_init(si_t *sih, uint8 use_seci) {return NULL;}
+#define si_seci_down(sih) do { } while (0)
+
+
+extern bool si_is_otp_disabled(si_t *sih);
+extern bool si_is_otp_powered(si_t *sih);
+extern void si_otp_power(si_t *sih, bool on);
+
+
+extern bool si_is_sprom_available(si_t *sih);
+extern bool si_is_sprom_enabled(si_t *sih);
+extern void si_sprom_enable(si_t *sih, bool enable);
 
 
+extern int si_cis_source(si_t *sih);
+#define CIS_DEFAULT    0
+#define CIS_SROM       1
+#define CIS_OTP                2
+
+
+#define        DEFAULT_FAB     0x0     
+#define        CSM_FAB7        0x1     
+#define        TSMC_FAB12      0x2     
+#define        SMIC_FAB4       0x3     
+extern int si_otp_fabid(si_t *sih, uint16 *fabid, bool rw);
+extern uint16 si_fabid(si_t *sih);
+
 
 extern int si_devpath(si_t *sih, char *path, int size);
 
@@ -244,4 +271,5 @@ extern uint32 si_pcieserdesreg(si_t *sih, uint32 mdioslave, uint32 offset, uint3
 
 char *si_getnvramflvar(si_t *sih, const char *name);
 
+
 #endif 
index 397006a..b52fb15 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: trxhdr.h,v 13.15.108.2 2010-11-15 17:57:30 Exp $
+ * $Id: trxhdr.h 286295 2011-09-27 06:39:43Z $
  */
 
 #ifndef        _TRX_HDR_H_
@@ -37,6 +37,7 @@
 #define TRX_OVERLAYS   0x4     /* Contains an overlay header after the trx header */
 #define TRX_MAX_OFFSET 3               /* Max number of individual files */
 #define TRX_UNCOMP_IMAGE       0x20    /* Trx contains uncompressed rtecdc.bin image */
+#define TRX_ROMSIM_IMAGE       0x10    /* Trx contains ROM simulation image */
 
 struct trx_header {
        uint32 magic;           /* "HDR0" */
index 228b5dc..d0902fe 100644 (file)
@@ -18,7 +18,7 @@
  *      Notwithstanding the above, under no circumstances may you combine this
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
- * $Id: typedefs.h,v 1.103.2.1 2010-05-11 18:19:28 Exp $
+ * $Id: typedefs.h 290055 2011-10-15 21:26:26Z $
  */
 
 
@@ -305,5 +305,8 @@ typedef float64 float_t;
 #define UNUSED_PARAMETER(x) (void)(x)
 
 
+#define DISCARD_QUAL(ptr, type) ((type *)(uintptr)(ptr))
+
+
 #include <bcmdefs.h>
 #endif 
index 7230d3b..d371051 100644 (file)
@@ -18,7 +18,7 @@
 *      Notwithstanding the above, under no circumstances may you combine this
 * software in any way with any other Broadcom software provided under a license
 * other than the GPL, without Broadcom's express prior written consent.
-* $Id: wlfc_proto.h,v 1.1.6.2 2010-05-08 01:30:41 Exp $
+* $Id: wlfc_proto.h 277737 2011-08-16 17:54:59Z $
 *
 */
 #ifndef __wlfc_proto_definitions_h__
index 9357552..676068c 100644 (file)
@@ -24,7 +24,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: wlioctl.h,v 1.767.2.38 2011-02-01 23:04:28 Exp $
+ * $Id: wlioctl.h 302303 2011-12-10 07:51:07Z $
  */
 
 
@@ -65,8 +65,8 @@ typedef struct wl_action_frame {
 
 typedef struct ssid_info
 {
-       uint8           ssid_len;
-       uint8           ssid[32];
+       uint8           ssid_len;       
+       uint8           ssid[32];       
 } ssid_info_t;
 
 typedef struct wl_af_params {
@@ -191,6 +191,7 @@ typedef struct wlc_ssid {
 #define WL_SCANFLAGS_PROHIBITED 0x04    
 
 #define WL_SCAN_PARAMS_SSID_MAX        10
+
 typedef struct wl_scan_params {
        wlc_ssid_t ssid;        
        struct ether_addr bssid;    
@@ -376,6 +377,8 @@ typedef struct {
 #define NRATE_SGI_SHIFT 23              
 #define NRATE_LDPC_CODING 0x00400000    
 #define NRATE_LDPC_SHIFT 22             
+#define NRATE_BCMC_OVERRIDE 0x00200000    
+#define NRATE_BCMC_SHIFT 21             
 
 #define NRATE_STF_SISO  0       
 #define NRATE_STF_CDD   1       
@@ -555,7 +558,7 @@ typedef enum sup_auth_status {
 #define CRYPTO_ALGO_AES_OCB_MSDU    5
 #define CRYPTO_ALGO_AES_OCB_MPDU    6
 #define CRYPTO_ALGO_NALG        7
-#define CRYPTO_ALGO_PMK                        12
+#define CRYPTO_ALGO_PMK                        12      
 
 #define WSEC_GEN_MIC_ERROR  0x0001
 #define WSEC_GEN_REPLAY     0x0002
@@ -617,9 +620,9 @@ typedef struct {
 #define WPA2_AUTH_PSK       0x0080  
 #define BRCM_AUTH_PSK           0x0100  
 #define BRCM_AUTH_DPT       0x0200  
-#define WPA2_AUTH_MFP           0x1000
-#define WPA2_AUTH_TPK          0x2000
-#define WPA2_AUTH_FT           0x4000
+#define WPA2_AUTH_MFP           0x1000  
+#define WPA2_AUTH_TPK          0x2000  
+#define WPA2_AUTH_FT           0x4000  
 
 
 #define MAXPMKID        16
@@ -649,12 +652,12 @@ typedef struct wl_assoc_info {
        uint32      resp_len;
        uint32      flags;
        struct dot11_assoc_req req;
-       struct ether_addr reassoc_bssid;
+       struct ether_addr reassoc_bssid;        
        struct dot11_assoc_resp resp;
 } wl_assoc_info_t;
 
 
-#define WLC_ASSOC_REQ_IS_REASSOC 0x01
+#define WLC_ASSOC_REQ_IS_REASSOC 0x01  
 
 
 typedef struct {
@@ -851,6 +854,7 @@ typedef struct wlc_iov_trx_s {
 #define WLC_GET_SSID                25
 #define WLC_SET_SSID                26
 #define WLC_RESTART             27
+#define WLC_TERMINATED             28
  
 #define WLC_GET_CHANNEL             29
 #define WLC_SET_CHANNEL             30
@@ -1203,7 +1207,7 @@ typedef struct {
 
 #define WL_AUTH_OPEN_SYSTEM     0   
 #define WL_AUTH_SHARED_KEY      1   
-#define WL_AUTH_OPEN_SHARED     2   
+#define WL_AUTH_OPEN_SHARED            3       
 
 
 #define WL_RADIO_SW_DISABLE     (1<<0)
@@ -1280,18 +1284,17 @@ typedef struct wl_po {
 #define WL_CHAN_FREQ_RANGE_5GM     2
 #define WL_CHAN_FREQ_RANGE_5GH     3
 
-#define WL_CHAN_FREQ_RANGE_5GLL_VER2    4
-#define WL_CHAN_FREQ_RANGE_5GLH_VER2    5
-#define WL_CHAN_FREQ_RANGE_5GML_VER2    6
-#define WL_CHAN_FREQ_RANGE_5GMH_VER2    7
-#define WL_CHAN_FREQ_RANGE_5GH_VER2     8
-
 #define WL_CHAN_FREQ_RANGE_5GLL_5BAND    4
 #define WL_CHAN_FREQ_RANGE_5GLH_5BAND    5
 #define WL_CHAN_FREQ_RANGE_5GML_5BAND    6
 #define WL_CHAN_FREQ_RANGE_5GMH_5BAND    7
 #define WL_CHAN_FREQ_RANGE_5GH_5BAND     8
 
+#define WL_CHAN_FREQ_RANGE_5G_BAND0     1
+#define WL_CHAN_FREQ_RANGE_5G_BAND1     2
+#define WL_CHAN_FREQ_RANGE_5G_BAND2     3
+#define WL_CHAN_FREQ_RANGE_5G_BAND3     4
+
 
 #define WLC_PHY_TYPE_A      0
 #define WLC_PHY_TYPE_B      1
@@ -1363,7 +1366,7 @@ typedef struct wl_po {
 #define PM_MAX  1
 #define PM_FAST 2
 
-#define LISTEN_INTERVAL                10
+#define LISTEN_INTERVAL                        10
 
 #define INTERFERE_OVRRIDE_OFF   -1  
 #define INTERFERE_NONE  0   
@@ -1493,6 +1496,7 @@ typedef struct wl_sampledata {
 #define WL_P2P_VAL      0x00000200
 #define WL_TXRX_VAL            0x00000400
 #define WL_MCHAN_VAL            0x00000800
+#define WL_TDLS_VAL            0x00001000
 
 
 #define WL_LED_NUMGPIO      16  
@@ -1546,7 +1550,7 @@ typedef struct wl_sampledata {
 #define WL_JOIN_PREF_WPA    2   
 #define WL_JOIN_PREF_BAND   3   
 #define WL_JOIN_PREF_RSSI_DELTA 4   
-#define WL_JOIN_PREF_TRANS_PREF        5
+#define WL_JOIN_PREF_TRANS_PREF        5       
 
 
 #define WLJP_BAND_ASSOC_PREF    255 
@@ -1797,17 +1801,19 @@ struct wl_msglevel2 {
 };
 
 typedef struct wl_mkeep_alive_pkt {
-       uint16  version;
-       uint16  length;
+       uint16  version; 
+       uint16  length; 
        uint32  period_msec;
        uint16  len_bytes;
-       uint8   keep_alive_id;
+       uint8   keep_alive_id; 
        uint8   data[1];
 } wl_mkeep_alive_pkt_t;
 
-#define WL_MKEEP_ALIVE_VERSION          1
-#define WL_MKEEP_ALIVE_FIXED_LEN        OFFSETOF(wl_mkeep_alive_pkt_t, data)
-#define WL_MKEEP_ALIVE_PRECISION        500
+#define WL_MKEEP_ALIVE_VERSION         1
+#define WL_MKEEP_ALIVE_FIXED_LEN       OFFSETOF(wl_mkeep_alive_pkt_t, data)
+#define WL_MKEEP_ALIVE_PRECISION       500
+
+
 
 #define WLC_ROAM_TRIGGER_DEFAULT    0 
 #define WLC_ROAM_TRIGGER_BANDWIDTH  1 
@@ -1897,7 +1903,7 @@ typedef struct wl_pfn_param {
        uint8 mscan; 
        uint8 repeat; 
        uint8 exp; 
-       int32 slow_freq;
+       int32 slow_freq; 
 } wl_pfn_param_t;
 
 typedef struct wl_pfn_bssid {
@@ -2016,8 +2022,31 @@ typedef struct wl_keep_alive_pkt {
 
 
 
+#define MAX_WAKE_PACKET_BYTES 128
+
+
+typedef struct pm_wake_packet {
+       uint32  status;         
+       uint32  pattern_id;     
+       uint32  original_packet_size;
+       uint32  saved_packet_size;
+       uchar   packet[MAX_WAKE_PACKET_BYTES];
+} pm_wake_packet_t;
+
+
+
+#define PKT_FILTER_MODE_FORWARD_ON_MATCH               1
+
+#define PKT_FILTER_MODE_DISABLE                                        2
+
+#define PKT_FILTER_MODE_PKT_CACHE_ON_MATCH             4
+
+#define PKT_FILTER_MODE_PKT_FORWARD_OFF_DEFAULT 8
+
+
 typedef enum wl_pkt_filter_type {
-       WL_PKT_FILTER_TYPE_PATTERN_MATCH    
+       WL_PKT_FILTER_TYPE_PATTERN_MATCH,       
+       WL_PKT_FILTER_TYPE_MAGIC_PATTERN_MATCH  
 } wl_pkt_filter_type_t;
 
 #define WL_PKT_FILTER_TYPE wl_pkt_filter_type_t
@@ -2550,6 +2579,12 @@ typedef struct wl_phycal_state {
 #define WL_PHYCAL_STAT_FIXED_LEN OFFSETOF(wl_phycal_state_t, phycal_core)
 #endif 
 
+#ifdef WLDSTA
+typedef struct wl_dsta_if {
+       struct ether_addr addr;
+} wl_dsta_if_t;
+#endif
+
 #ifdef WLP2P
 
 typedef struct wl_p2p_disc_st {
index b3fcdd2..4ef7bf7 100644 (file)
@@ -21,7 +21,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: linux_osl.c,v 1.168.2.7 2011-01-27 17:01:13 Exp $
+ * $Id: linux_osl.c,v 1.168.2.7 2011-01-27 17:01:13 $
  */
 
 
@@ -226,17 +226,16 @@ osl_attach(void *pdev, uint bustype, bool pkttag)
        }
 
        if (!bcm_static_skb) {
-               void *skb_buff_ptr = dhd_os_prealloc(osh, 4, 0);
-
-               if (skb_buff_ptr) {
-                       bcm_static_skb = (bcm_static_pkt_t *)((char *)bcm_static_buf + 2048);
-                       bcopy(skb_buff_ptr, bcm_static_skb, sizeof(struct sk_buff *) * 16);
-                       for (i = 0; i < STATIC_PKT_MAX_NUM * 2; i++)
-                               bcm_static_skb->pkt_use[i] = 0;
-                       sema_init(&bcm_static_skb->osl_pkt_sem, 1);
-               } else {
-                       printk("can not alloc static skb buffers\n");
-               }
+               int i;
+               void *skb_buff_ptr = 0;
+               bcm_static_skb = (bcm_static_pkt_t *)((char *)bcm_static_buf + 2048);
+               skb_buff_ptr = dhd_os_prealloc(osh, 4, 0);
+
+               bcopy(skb_buff_ptr, bcm_static_skb, sizeof(struct sk_buff *) * 16);
+               for (i = 0; i < STATIC_PKT_MAX_NUM * 2; i++)
+                       bcm_static_skb->pkt_use[i] = 0;
+
+               sema_init(&bcm_static_skb->osl_pkt_sem, 1);
        }
 #endif
 
index 22aa412..4b71563 100644 (file)
@@ -22,7 +22,7 @@
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
  *
- * $Id: siutils.c,v 1.813.2.36 2011-02-10 23:43:55 Exp $
+ * $Id: siutils.c,v 1.813.2.36 2011-02-10 23:43:55 $
  */
 
 #include <typedefs.h>
@@ -213,11 +213,11 @@ si_buscore_setup(si_info_t *sii, chipcregs_t *cc, uint bustype, uint32 savewin,
 
        /* figure out bus/orignal core idx */
        sii->pub.buscoretype = NODEV_CORE_ID;
-       sii->pub.buscorerev = NOREV;
+       sii->pub.buscorerev = (uint)NOREV;
        sii->pub.buscoreidx = BADIDX;
 
        pci = pcie = FALSE;
-       pcirev = pcierev = NOREV;
+       pcirev = pcierev = (uint)NOREV;
        pciidx = pcieidx = BADIDX;
 
        for (i = 0; i < sii->numcores; i++) {
@@ -365,6 +365,19 @@ si_doattach(si_info_t *sii, uint devid, osl_t *osh, void *regs,
                return NULL;
        }
 
+#if defined(HW_OOB)
+       if (CHIPID(sih->chip) == BCM43362_CHIP_ID) {
+               uint32 gpiocontrol, addr;
+               addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, gpiocontrol);
+               gpiocontrol = bcmsdh_reg_read(sdh, addr, 4);
+               gpiocontrol |= 0x2;
+               bcmsdh_reg_write(sdh, addr, 4, gpiocontrol);
+               bcmsdh_cfg_write(sdh, SDIO_FUNC_1, 0x10005, 0xf, NULL);
+               bcmsdh_cfg_write(sdh, SDIO_FUNC_1, 0x10006, 0x0, NULL);
+               bcmsdh_cfg_write(sdh, SDIO_FUNC_1, 0x10007, 0x2, NULL);
+       }
+#endif
+
        if ((CHIPID(sih->chip) == BCM4329_CHIP_ID) && (sih->chiprev == 0) &&
                (sih->chippkg != BCM4329_289PIN_PKG_ID)) {
                sih->chippkg = BCM4329_182PIN_PKG_ID;
@@ -401,8 +414,9 @@ si_doattach(si_info_t *sii, uint devid, osl_t *osh, void *regs,
        }
 
        /* assume current core is CC */
-       if ((sii->pub.ccrev == 0x25) && ((CHIPID(sih->chip) == BCM43236_CHIP_ID ||
+       if ((sii->pub.ccrev == 0x25) && ((CHIPID(sih->chip) == BCM43234_CHIP_ID ||
                                          CHIPID(sih->chip) == BCM43235_CHIP_ID ||
+                                         CHIPID(sih->chip) == BCM43236_CHIP_ID ||
                                          CHIPID(sih->chip) == BCM43238_CHIP_ID) &&
                                         (CHIPREV(sii->pub.chiprev) == 0))) {
 
@@ -1093,6 +1107,126 @@ si_watchdog_ms(si_t *sih, uint32 ms)
 
 
 
+/* return the slow clock source - LPO, XTAL, or PCI */
+static uint
+si_slowclk_src(si_info_t *sii)
+{
+       chipcregs_t *cc;
+
+       ASSERT(SI_FAST(sii) || si_coreid(&sii->pub) == CC_CORE_ID);
+
+       if (sii->pub.ccrev < 6) {
+               if ((BUSTYPE(sii->pub.bustype) == PCI_BUS) &&
+                   (OSL_PCI_READ_CONFIG(sii->osh, PCI_GPIO_OUT, sizeof(uint32)) &
+                    PCI_CFG_GPIO_SCS))
+                       return (SCC_SS_PCI);
+               else
+                       return (SCC_SS_XTAL);
+       } else if (sii->pub.ccrev < 10) {
+               cc = (chipcregs_t *)si_setcoreidx(&sii->pub, sii->curidx);
+               return (R_REG(sii->osh, &cc->slow_clk_ctl) & SCC_SS_MASK);
+       } else  /* Insta-clock */
+               return (SCC_SS_XTAL);
+}
+
+/* return the ILP (slowclock) min or max frequency */
+static uint
+si_slowclk_freq(si_info_t *sii, bool max_freq, chipcregs_t *cc)
+{
+       uint32 slowclk;
+       uint div;
+
+       ASSERT(SI_FAST(sii) || si_coreid(&sii->pub) == CC_CORE_ID);
+
+       /* shouldn't be here unless we've established the chip has dynamic clk control */
+       ASSERT(R_REG(sii->osh, &cc->capabilities) & CC_CAP_PWR_CTL);
+
+       slowclk = si_slowclk_src(sii);
+       if (sii->pub.ccrev < 6) {
+               if (slowclk == SCC_SS_PCI)
+                       return (max_freq ? (PCIMAXFREQ / 64) : (PCIMINFREQ / 64));
+               else
+                       return (max_freq ? (XTALMAXFREQ / 32) : (XTALMINFREQ / 32));
+       } else if (sii->pub.ccrev < 10) {
+               div = 4 *
+                       (((R_REG(sii->osh, &cc->slow_clk_ctl) & SCC_CD_MASK) >> SCC_CD_SHIFT) + 1);
+               if (slowclk == SCC_SS_LPO)
+                       return (max_freq ? LPOMAXFREQ : LPOMINFREQ);
+               else if (slowclk == SCC_SS_XTAL)
+                       return (max_freq ? (XTALMAXFREQ / div) : (XTALMINFREQ / div));
+               else if (slowclk == SCC_SS_PCI)
+                       return (max_freq ? (PCIMAXFREQ / div) : (PCIMINFREQ / div));
+               else
+                       ASSERT(0);
+       } else {
+               /* Chipc rev 10 is InstaClock */
+               div = R_REG(sii->osh, &cc->system_clk_ctl) >> SYCC_CD_SHIFT;
+               div = 4 * (div + 1);
+               return (max_freq ? XTALMAXFREQ : (XTALMINFREQ / div));
+       }
+       return (0);
+}
+
+static void
+si_clkctl_setdelay(si_info_t *sii, void *chipcregs)
+{
+       chipcregs_t *cc = (chipcregs_t *)chipcregs;
+       uint slowmaxfreq, pll_delay, slowclk;
+       uint pll_on_delay, fref_sel_delay;
+
+       pll_delay = PLL_DELAY;
+
+       /* If the slow clock is not sourced by the xtal then add the xtal_on_delay
+        * since the xtal will also be powered down by dynamic clk control logic.
+        */
+
+       slowclk = si_slowclk_src(sii);
+       if (slowclk != SCC_SS_XTAL)
+               pll_delay += XTAL_ON_DELAY;
+
+       /* Starting with 4318 it is ILP that is used for the delays */
+       slowmaxfreq = si_slowclk_freq(sii, (sii->pub.ccrev >= 10) ? FALSE : TRUE, cc);
+
+       pll_on_delay = ((slowmaxfreq * pll_delay) + 999999) / 1000000;
+       fref_sel_delay = ((slowmaxfreq * FREF_DELAY) + 999999) / 1000000;
+
+       W_REG(sii->osh, &cc->pll_on_delay, pll_on_delay);
+       W_REG(sii->osh, &cc->fref_sel_delay, fref_sel_delay);
+}
+
+/* initialize power control delay registers */
+void
+si_clkctl_init(si_t *sih)
+{
+       si_info_t *sii;
+       uint origidx = 0;
+       chipcregs_t *cc;
+       bool fast;
+
+       if (!CCCTL_ENAB(sih))
+               return;
+
+       sii = SI_INFO(sih);
+       fast = SI_FAST(sii);
+       if (!fast) {
+               origidx = sii->curidx;
+               if ((cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0)) == NULL)
+                       return;
+       } else if ((cc = (chipcregs_t *)CCREGS_FAST(sii)) == NULL)
+               return;
+       ASSERT(cc != NULL);
+
+       /* set all Instaclk chip ILP to 1 MHz */
+       if (sih->ccrev >= 10)
+               SET_REG(sii->osh, &cc->system_clk_ctl, SYCC_CD_MASK,
+                       (ILP_DIV_1MHZ << SYCC_CD_SHIFT));
+
+       si_clkctl_setdelay(sii, (void *)(uintptr)cc);
+
+       if (!fast)
+               si_setcoreidx(sih, origidx);
+}
+
 /* change logical "focus" to the gpio core for optimized access */
 void *
 si_gpiosetcore(si_t *sih)
@@ -1718,3 +1852,56 @@ si_deviceremoved(si_t *sih)
        }
        return FALSE;
 }
+
+bool
+si_is_sprom_available(si_t *sih)
+{
+       if (sih->ccrev >= 31) {
+               si_info_t *sii;
+               uint origidx;
+               chipcregs_t *cc;
+               uint32 sromctrl;
+
+               if ((sih->cccaps & CC_CAP_SROM) == 0)
+                       return FALSE;
+
+               sii = SI_INFO(sih);
+               origidx = sii->curidx;
+               cc = si_setcoreidx(sih, SI_CC_IDX);
+               sromctrl = R_REG(sii->osh, &cc->sromcontrol);
+               si_setcoreidx(sih, origidx);
+               return (sromctrl & SRC_PRESENT);
+       }
+
+       switch (CHIPID(sih->chip)) {
+       case BCM4312_CHIP_ID:
+               return ((sih->chipst & CST4312_SPROM_OTP_SEL_MASK) != CST4312_OTP_SEL);
+       case BCM4325_CHIP_ID:
+               return (sih->chipst & CST4325_SPROM_SEL) != 0;
+       case BCM4322_CHIP_ID:
+       case BCM43221_CHIP_ID:
+       case BCM43231_CHIP_ID:
+       case BCM43222_CHIP_ID:
+       case BCM43111_CHIP_ID:
+       case BCM43112_CHIP_ID:
+       case BCM4342_CHIP_ID:
+       {
+               uint32 spromotp;
+               spromotp = (sih->chipst & CST4322_SPROM_OTP_SEL_MASK) >>
+                       CST4322_SPROM_OTP_SEL_SHIFT;
+               return (spromotp & CST4322_SPROM_PRESENT) != 0;
+       }
+       case BCM4329_CHIP_ID:
+               return (sih->chipst & CST4329_SPROM_SEL) != 0;
+       case BCM4315_CHIP_ID:
+               return (sih->chipst & CST4315_SPROM_SEL) != 0;
+       case BCM4319_CHIP_ID:
+               return (sih->chipst & CST4319_SPROM_SEL) != 0;
+       case BCM4330_CHIP_ID:
+               return (sih->chipst & CST4330_SPROM_PRESENT) != 0;
+       case BCM4313_CHIP_ID:
+               return (sih->chipst & CST4313_SPROM_PRESENT) != 0;
+       default:
+               return TRUE;
+       }
+}
index b680481..dc32f17 100644 (file)
@@ -2,13 +2,13 @@
  * Linux cfg80211 driver - Android related functions
  *
  * Copyright (C) 1999-2011, Broadcom Corporation
- *
+ * 
  *         Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
  * under the terms of the GNU General Public License version 2 (the "GPL"),
  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
  * following added to such license:
- *
+ * 
  *      As a special exception, the copyright holders of this software give you
  * permission to link this software with independent modules, and to copy and
  * distribute the resulting executable under terms of your choice, provided that
@@ -16,7 +16,7 @@
  * the license of that module.  An independent module is a module which is not
  * derived from this software.  The special exception does not apply to any
  * modifications of the software.
- *
+ * 
  *      Notwithstanding the above, under no circumstances may you combine this
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
index b7696eb..c0857b6 100644 (file)
@@ -2,13 +2,13 @@
  * Linux cfg80211 driver
  *
  * Copyright (C) 1999-2011, Broadcom Corporation
- *
+ * 
  *         Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
  * under the terms of the GNU General Public License version 2 (the "GPL"),
  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
  * following added to such license:
- *
+ * 
  *      As a special exception, the copyright holders of this software give you
  * permission to link this software with independent modules, and to copy and
  * distribute the resulting executable under terms of your choice, provided that
@@ -16,7 +16,7 @@
  * the license of that module.  An independent module is a module which is not
  * derived from this software.  The special exception does not apply to any
  * modifications of the software.
- *
+ * 
  *      Notwithstanding the above, under no circumstances may you combine this
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
@@ -65,8 +65,8 @@
 #include <wl_cfg80211.h>
 #include <wl_cfgp2p.h>
 
-static struct sdio_func *cfg80211_sdio_func;
-static struct wl_priv *wlcfg_drv_priv;
+static struct device *cfg80211_parent_dev = NULL;
+static struct wl_priv *wlcfg_drv_priv = NULL;
 
 u32 wl_dbg_level = WL_DBG_ERR;
 
@@ -103,6 +103,11 @@ static int wl_cfg80211_btcoex_init(struct wl_priv *wl);
 static void wl_cfg80211_btcoex_deinit(struct wl_priv *wl);
 #endif
 
+/* Set this to 1 to use a seperate interface (p2p0)
+ *  for p2p operations.
+ */
+#define ENABLE_P2P_INTERFACE   1
+
 /* This is to override regulatory domains defined in cfg80211 module (reg.c)
  * By default world regulatory domain defined in reg.c puts the flags NL80211_RRF_PASSIVE_SCAN
  * and NL80211_RRF_NO_IBSS for 5GHz channels (for 36..48 and 149..165).
@@ -224,7 +229,7 @@ static s32 wl_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *dev,
        struct cfg80211_pmksa *pmksa);
 static s32 wl_cfg80211_flush_pmksa(struct wiphy *wiphy,
        struct net_device *dev);
-static void wl_notify_escan_complete(struct wl_priv *wl, bool aborted);
+static void wl_notify_escan_complete(struct wl_priv *wl, struct net_device *ndev, bool aborted);
 /*
  * event & event Q handlers for cfg80211 interfaces
  */
@@ -261,8 +266,7 @@ static s32 wl_notify_pfn_status(struct wl_priv *wl, struct net_device *ndev,
 /*
  * register/deregister sdio function
  */
-struct sdio_func *wl_cfg80211_get_sdio_func(void);
-static void wl_clear_sdio_func(void);
+static void wl_cfg80211_clear_parent_dev(void);
 
 /*
  * ioctl utilites
@@ -285,10 +289,10 @@ static s32 wl_set_retry(struct net_device *dev, u32 retry, bool l);
 /*
  * wl profile utilities
  */
-static s32 wl_update_prof(struct wl_priv *wl, const wl_event_msg_t *e,
-       void *data, s32 item);
-static void *wl_read_prof(struct wl_priv *wl, s32 item);
-static void wl_init_prof(struct wl_priv *wl);
+static s32 wl_update_prof(struct wl_priv *wl, struct net_device *ndev,
+       const wl_event_msg_t *e, void *data, s32 item);
+static void *wl_read_prof(struct wl_priv *wl, struct net_device *ndev, s32 item);
+static void wl_init_prof(struct wl_priv *wl, struct net_device *ndev);
 
 /*
  * cfg80211 connect utilites
@@ -316,7 +320,6 @@ static s32 wl_mrg_ie(struct wl_priv *wl, u8 *ie_stream, u16 ie_size);
 static s32 wl_cp_ie(struct wl_priv *wl, u8 *dst, u16 dst_size);
 static u32 wl_get_ielen(struct wl_priv *wl);
 
-static s32 wl_mode_to_nl80211_iftype(s32 mode);
 
 static struct wireless_dev *wl_alloc_wdev(struct device *sdiofunc_dev);
 static void wl_free_wdev(struct wl_priv *wl);
@@ -324,6 +327,7 @@ static void wl_free_wdev(struct wl_priv *wl);
 static s32 wl_inform_bss(struct wl_priv *wl);
 static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi);
 static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev);
+static chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy);
 
 static s32 wl_add_keyext(struct wiphy *wiphy, struct net_device *dev,
        u8 key_idx, const u8 *mac_addr,
@@ -426,7 +430,7 @@ static __used s32 wl_update_pmklist(struct net_device *dev,
 /*
  * debufs support
  */
-static int wl_debugfs_add_netdev_params(struct wl_priv *wl);
+static int wl_debugfs_add_netdev_params(struct wl_priv *wl, struct net_device *ndev);
 static void wl_debugfs_remove_netdev(struct wl_priv *wl);
 
 /*
@@ -446,10 +450,10 @@ int dhd_start_xmit(struct sk_buff *skb, struct net_device *net);
 
 #define CHECK_SYS_UP(wlpriv)                                                   \
 do {                                                                   \
-       if (unlikely(!wl_get_drv_status(wlpriv, READY))) {      \
-               WL_INFO(("device is not ready : status (%d)\n",         \
-                       (int)wlpriv->status));                  \
-               return -EIO;                                            \
+       struct net_device *ndev = wl_to_prmry_ndev(wlpriv);       \
+       if (unlikely(!wl_get_drv_status(wlpriv, READY, ndev))) {        \
+               WL_INFO(("device is not ready\n"));             \
+                       return -EIO;                                    \
        }                                                               \
 } while (0)
 
@@ -591,7 +595,7 @@ static const u32 __wl_cipher_suites[] = {
        WLAN_CIPHER_SUITE_WEP104,
        WLAN_CIPHER_SUITE_TKIP,
        WLAN_CIPHER_SUITE_CCMP,
-       WLAN_CIPHER_SUITE_AES_CMAC
+       WLAN_CIPHER_SUITE_AES_CMAC,
 };
 
 /* There isn't a lot of sense in it, but you can transmit anything you like */
@@ -742,6 +746,40 @@ wl_validate_wps_ie(char *wps_ie, bool *pbc)
        }
 }
 
+static chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy)
+{
+       chanspec_t chspec;
+       int err = 0;
+       struct wl_priv *wl = wiphy_priv(wiphy);
+       struct net_device *dev = wl_to_prmry_ndev(wl);
+       struct ether_addr bssid;
+       struct wl_bss_info *bss = NULL;
+
+       if ((err = wldev_ioctl(dev, WLC_GET_BSSID, &bssid, sizeof(bssid), false))) {
+               /* STA interface is not associated. So start the new interface on a temp
+                * channel . Later proper channel will be applied by the above framework
+                * via set_channel (cfg80211 API).
+                */
+               WL_DBG(("Not associated. Return a temp channel. \n"));
+               return wf_chspec_aton(WL_P2P_TEMP_CHAN);
+       }
+
+
+       *(u32 *) wl->extra_buf = htod32(WL_EXTRA_BUF_MAX);
+       if ((err = wldev_ioctl(dev, WLC_GET_BSS_INFO, wl->extra_buf,
+               sizeof(WL_EXTRA_BUF_MAX), false))) {
+                       WL_ERR(("Failed to get associated bss info, use temp channel \n"));
+                       chspec = wf_chspec_aton(WL_P2P_TEMP_CHAN);
+       }
+       else {
+                       bss = (struct wl_bss_info *) (wl->extra_buf + 4);
+                       chspec =  bss->chanspec;
+                       WL_DBG(("Valid BSS Found. chanspec:%d \n", bss->chanspec));
+       }
+
+       return chspec;
+}
+
 static struct net_device* wl_cfg80211_add_monitor_if(char *name)
 {
        int ret = 0;
@@ -760,7 +798,6 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name,
        s32 err;
        s32 timeout = -1;
        s32 wlif_type = -1;
-       s32 index = 0;
        s32 mode = 0;
        chanspec_t chspec;
        struct wl_priv *wl = wiphy_priv(wiphy);
@@ -768,6 +805,8 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name,
        dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub);
        int (*net_attach)(dhd_pub_t *dhdp, int ifidx);
        bool rollback_lock = false;
+       /* Use primary I/F for sending cmds down to firmware */
+       _ndev = wl_to_prmry_ndev(wl);
 
        WL_DBG(("if name: %s, type: %d\n", name, type));
        switch (type) {
@@ -800,6 +839,8 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name,
                WL_ERR(("name is NULL\n"));
                return NULL;
        }
+       if (wl->iface_cnt == IFACE_MAX_CNT)
+               return ERR_PTR(-ENOMEM);
        if (wl->p2p_supported && (wlif_type != -1)) {
                if (wl_get_p2p_status(wl, IF_DELETING)) {
                        /* wait till IF_DEL is complete
@@ -828,7 +869,7 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name,
                                return ERR_PTR(-EAGAIN);
                        }
                }
-               if (!p2p_on(wl) && strstr(name, WL_P2P_INTERFACE_PREFIX)) {
+               if (!p2p_is_on(wl) && strstr(name, WL_P2P_INTERFACE_PREFIX)) {
                        p2p_on(wl) = true;
                        wl_cfgp2p_set_firm_p2p(wl);
                        wl_cfgp2p_init_discovery(wl);
@@ -837,8 +878,11 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name,
                strncpy(wl->p2p->vir_ifname, name, IFNAMSIZ - 1);
                wl_cfgp2p_generate_bss_mac(&dhd->mac, &wl->p2p->dev_addr, &wl->p2p->int_addr);
 
-               /* Temporary use channel 11, in case GO will be changed with set_channel API  */
-               chspec = wf_chspec_aton(WL_P2P_TEMP_CHAN);
+               /* In concurrency case, STA may be already associated in a particular channel.
+                * so retrieve the current channel of primary interface and then start the virtual
+                * interface on that.
+                */
+                chspec = wl_cfg80211_get_shared_freq(wiphy);
 
                /* For P2P mode, use P2P-specific driver features to create the
                 * bss: "wl p2p_ifadd"
@@ -865,26 +909,21 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name,
                        vwdev->wiphy = wl->wdev->wiphy;
                        WL_INFO((" virtual interface(%s) is created memalloc done \n",
                                wl->p2p->vir_ifname));
-                       index = alloc_idx_vwdev(wl);
-                       wl->vwdev[index] = vwdev;
-                       vwdev->iftype =
-                               (wlif_type == WL_P2P_IF_CLIENT) ? NL80211_IFTYPE_STATION
-                               : NL80211_IFTYPE_AP;
+                       vwdev->iftype = type;
                        _ndev =  wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION);
                        _ndev->ieee80211_ptr = vwdev;
                        SET_NETDEV_DEV(_ndev, wiphy_dev(vwdev->wiphy));
                        vwdev->netdev = _ndev;
-                       wl_set_drv_status(wl, READY);
+                       wl_set_drv_status(wl, READY, _ndev);
                        wl->p2p->vif_created = true;
-                       set_mode_by_netdev(wl, _ndev, mode);
-                       WL_DBG((" virtual interface(%s) wl->wdev %p wl->wdev->netdev %p vwdev %p vwdev->netdev %p\n",
-                               wl->p2p->vir_ifname, wl->wdev, wl->wdev->netdev, vwdev, vwdev->netdev));
+                       wl_set_mode_by_netdev(wl, _ndev, mode);
                        net_attach =  wl_to_p2p_bss_private(wl, P2PAPI_BSSCFG_CONNECTION);
                        if (rtnl_is_locked()) {
                                rtnl_unlock();
                                rollback_lock = true;
                        }
                        if (net_attach && !net_attach(dhd, _ndev->ifindex)) {
+                               wl_alloc_netinfo(wl, _ndev, vwdev, mode);
                                WL_DBG((" virtual interface(%s) is "
                                        "created net attach done\n", wl->p2p->vir_ifname));
                        } else {
@@ -917,10 +956,18 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev)
        s32 timeout = -1;
        s32 ret = 0;
        WL_DBG(("Enter\n"));
+
+       if (wl->p2p_net == dev) {
+               /* Since there is no ifidx corresponding to p2p0, cmds to
+                * firmware should be routed through primary I/F
+                */
+               dev = wl_to_prmry_ndev(wl);
+       }
+
        if (wl->p2p_supported) {
                memcpy(p2p_mac.octet, wl->p2p->int_addr.octet, ETHER_ADDR_LEN);
                if (wl->p2p->vif_created) {
-                       if (wl_get_drv_status(wl, SCANNING)) {
+                       if (wl_get_drv_status(wl, SCANNING, dev)) {
                                wl_cfg80211_scan_abort(wl, dev);
                        }
                        wldev_iovar_setint(dev, "mpc", 1);
@@ -933,14 +980,10 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev)
                        * ifconfig <inter> down and up sequnce, which will reload the fw
                        * however we should cleanup the linux network virtual interfaces
                        */
-                       /* Request framework to RESET and clean up */
-                               struct net_device *ndev = wl_to_prmry_ndev(wl);
-                               WL_ERR(("Firmware returned an error (%d) from p2p_ifdel"
-                                       "HANG Notification sent to %s dev %p wdev %p ndev %p\n", ret, ndev->name, dev, wl->wdev, wl_to_prmry_ndev(wl)));
-                               wl_cfg80211_hang(ndev, WLAN_REASON_UNSPECIFIED);
-                       }
-                       else {
-                               WL_ERR(("Firmware success from p2p_ifdel dev %p wdev %p ndev %p", dev, wl->wdev, wl_to_prmry_ndev(wl)));
+                               dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub);
+                               WL_ERR(("Firmware returned an error from p2p_ifdel\n"));
+                               WL_ERR(("try to remove linux virtual interface %s\n", dev->name));
+                               dhd_del_if(dhd->info, dhd_net2idx(dhd->info, dev));
                        }
 
                        /* Wait for any pending scan req to get aborted from the sysioc context */
@@ -998,13 +1041,18 @@ wl_cfg80211_change_virtual_iface(struct wiphy *wiphy, struct net_device *ndev,
                return -EINVAL;
        }
 
-
        if (ap) {
-               set_mode_by_netdev(wl, ndev, mode);
+               wl_set_mode_by_netdev(wl, ndev, mode);
                if (wl->p2p_supported && wl->p2p->vif_created) {
                        WL_DBG(("p2p_vif_created (%d) p2p_on (%d)\n", wl->p2p->vif_created,
                        p2p_on(wl)));
-                       chspec = wf_chspec_aton(WL_P2P_TEMP_CHAN);
+
+                       /* In concurrency case, STA may be already associated in a particular
+                        * channel. so retrieve the current channel of primary interface and
+                        * then start the virtual interface on that.
+                        */
+                       chspec = wl_cfg80211_get_shared_freq(wiphy);
+
                        wlif_type = ap ? WL_P2P_IF_GO : WL_P2P_IF_CLIENT;
                        WL_ERR(("%s : ap (%d), infra (%d), iftype: (%d)\n",
                                ndev->name, ap, infra, type));
@@ -1014,12 +1062,12 @@ wl_cfg80211_change_virtual_iface(struct wiphy *wiphy, struct net_device *ndev,
                        timeout = wait_event_interruptible_timeout(wl->dongle_event_wait,
                                (wl_get_p2p_status(wl, IF_CHANGED) == true),
                                msecs_to_jiffies(MAX_WAIT_TIME));
-                       set_mode_by_netdev(wl, ndev, mode);
+                       wl_set_mode_by_netdev(wl, ndev, mode);
                        wl_clr_p2p_status(wl, IF_CHANGING);
                        wl_clr_p2p_status(wl, IF_CHANGED);
                } else if (ndev == wl_to_prmry_ndev(wl) &&
-                       !wl_get_drv_status(wl, AP_CREATED)) {
-                       wl_set_drv_status(wl, AP_CREATING);
+                       !wl_get_drv_status(wl, AP_CREATED, ndev)) {
+                       wl_set_drv_status(wl, AP_CREATING, ndev);
                        if (!wl->ap_info &&
                                !(wl->ap_info = kzalloc(sizeof(struct ap_info), GFP_KERNEL))) {
                                WL_ERR(("struct ap_saved_ie allocation failed\n"));
@@ -1077,7 +1125,8 @@ wl_cfg80211_notify_ifdel(struct net_device *ndev)
 
        if (p2p_is_on(wl) && wl->p2p->vif_created &&
                wl_get_p2p_status(wl, IF_DELETING)) {
-               if (wl->scan_request) {
+               if (wl->scan_request &&
+                       (wl->escan_info.ndev == ndev)) {
                        /* Abort any pending scan requests */
                        wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE;
                        if (!rtnl_is_locked()) {
@@ -1085,7 +1134,7 @@ wl_cfg80211_notify_ifdel(struct net_device *ndev)
                                rollback_lock = true;
                        }
                        WL_DBG(("ESCAN COMPLETED\n"));
-                       wl_notify_escan_complete(wl, true);
+                       wl_notify_escan_complete(wl, ndev, true);
                        if (rollback_lock)
                                rtnl_unlock();
                }
@@ -1109,18 +1158,6 @@ wl_cfg80211_notify_ifdel(struct net_device *ndev)
        return 0;
 }
 
-s32 wl_cfg80211_post_del(void* ndev)
-{
-       int index;
-       struct wl_priv *wl = wlcfg_drv_priv;
-       index = get_idx_vwdev_by_netdev(wl, (struct net_device *)ndev);
-       WL_DBG(("index : %d\n", index));
-       if (index >= 0) {
-               free_vwdev_by_index(wl, index);
-       }
-       return 0;
-}
-
 s32
 wl_cfg80211_is_progress_ifadd(void)
 {
@@ -1386,7 +1423,7 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev,
                        WL_ERR((" Escan set error (%d)\n", err));
                kfree(params);
        }
-       else if (p2p_on(wl) && p2p_scan(wl)) {
+       else if (p2p_is_on(wl) && p2p_scan(wl)) {
                /* P2P SCAN TRIGGER */
                if (scan_request && scan_request->n_channels) {
                        num_chans = scan_request->n_channels;
@@ -1412,7 +1449,7 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev,
                                search_state = WL_P2P_DISC_ST_SEARCH;
                                WL_INFO(("P2P SEARCH PHASE START \n"));
                        } else if ((dev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION)) &&
-                               (get_mode_by_netdev(wl, dev) == WL_MODE_AP)) {
+                               (wl_get_mode_by_netdev(wl, dev) == WL_MODE_AP)) {
                                /* If you are already a GO, then do SEARCH only */
                                WL_INFO(("Already a GO. Do SEARCH Only"));
                                search_state = WL_P2P_DISC_ST_SEARCH;
@@ -1442,7 +1479,7 @@ wl_do_escan(struct wl_priv *wl, struct wiphy *wiphy, struct net_device *ndev,
        s32 passive_scan;
        wl_scan_results_t *results;
        WL_SCAN(("Enter \n"));
-
+       wl->escan_info.ndev = ndev;
        wl->escan_info.wiphy = wiphy;
        wl->escan_info.escan_state = WL_ESCAN_STATE_SCANING;
        passive_scan = wl->active_scan ? 0 : 1;
@@ -1473,21 +1510,27 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
        s32 passive_scan;
        bool iscan_req;
        bool escan_req;
-       bool spec_scan;
        bool p2p_ssid;
        s32 err = 0;
        s32 i;
        u32 wpsie_len = 0;
        u8 wpsie[IE_MAX_LEN];
 
+       /* If scan req comes for p2p0, send it over primary I/F as there
+        * there is no firmware interface corresponding to p2p0.
+        * Scan results will be delivered corresponding to cfg80211_scan_request
+        */
+       if (ndev == wl->p2p_net) {
+               ndev = wl_to_prmry_ndev(wl);
+       }
+
        WL_DBG(("Enter wiphy (%p)\n", wiphy));
-       if (unlikely(wl_get_drv_status(wl, SCANNING))) {
-               WL_ERR(("Scanning already : status (%d)\n", (int)wl->status));
+       if (wl_get_drv_status_all(wl, SCANNING)) {
+               WL_ERR(("Scanning already\n"));
                return -EAGAIN;
        }
-       if (unlikely(wl_get_drv_status(wl, SCAN_ABORTING))) {
-               WL_ERR(("Scanning being aborted : status (%d)\n",
-                       (int)wl->status));
+       if (wl_get_drv_status(wl, SCAN_ABORTING, ndev)) {
+               WL_ERR(("Scanning being aborted\n"));
                return -EAGAIN;
        }
        if (request && request->n_ssids > WL_SCAN_PARAMS_SSID_MAX) {
@@ -1498,7 +1541,6 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
        /* Arm scan timeout timer */
        mod_timer(&wl->scan_timeout, jiffies + WL_SCAN_TIMER_INTERVAL_MS * HZ / 1000);
        iscan_req = false;
-       spec_scan = false;
        if (request) {          /* scan bss */
                ssids = request->ssids;
                if (wl->iscan_on && (!ssids || !ssids->ssid_len || request->n_ssids != 1)) {
@@ -1572,7 +1614,7 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
                ssids = this_ssid;
        }
        wl->scan_request = request;
-       wl_set_drv_status(wl, SCANNING);
+       wl_set_drv_status(wl, SCANNING, ndev);
        if (iscan_req) {
                err = wl_do_iscan(wl, request);
                if (likely(!err))
@@ -1607,7 +1649,6 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
                        sr->ssid.SSID_len = htod32(sr->ssid.SSID_len);
                        WL_SCAN(("Specific scan ssid=\"%s\" len=%d\n",
                                sr->ssid.SSID, sr->ssid.SSID_len));
-                       spec_scan = true;
                } else {
                        WL_SCAN(("Broadcast scan\n"));
                }
@@ -1635,7 +1676,7 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
        return 0;
 
 scan_out:
-       wl_clr_drv_status(wl, SCANNING);
+       wl_clr_drv_status(wl, SCANNING, ndev);
        wl->scan_request = NULL;
        return err;
 }
@@ -1891,7 +1932,7 @@ wl_set_wpa_version(struct net_device *dev, struct cfg80211_connect_params *sme)
                WL_ERR(("set wpa_auth failed (%d)\n", err));
                return err;
        }
-       sec = wl_read_prof(wl, WL_PROF_SEC);
+       sec = wl_read_prof(wl, dev, WL_PROF_SEC);
        sec->wpa_versions = sme->crypto.wpa_versions;
        return err;
 }
@@ -1930,7 +1971,7 @@ wl_set_auth_type(struct net_device *dev, struct cfg80211_connect_params *sme)
                WL_ERR(("set auth failed (%d)\n", err));
                return err;
        }
-       sec = wl_read_prof(wl, WL_PROF_SEC);
+       sec = wl_read_prof(wl, dev, WL_PROF_SEC);
        sec->auth_type = sme->auth_type;
        return err;
 }
@@ -2002,7 +2043,7 @@ wl_set_set_cipher(struct net_device *dev, struct cfg80211_connect_params *sme)
                return err;
        }
 
-       sec = wl_read_prof(wl, WL_PROF_SEC);
+       sec = wl_read_prof(wl, dev, WL_PROF_SEC);
        sec->cipher_pairwise = sme->crypto.ciphers_pairwise[0];
        sec->cipher_group = sme->crypto.cipher_group;
 
@@ -2059,7 +2100,7 @@ wl_set_key_mgmt(struct net_device *dev, struct cfg80211_connect_params *sme)
                        return err;
                }
        }
-       sec = wl_read_prof(wl, WL_PROF_SEC);
+       sec = wl_read_prof(wl, dev, WL_PROF_SEC);
        sec->wpa_auth = sme->crypto.akm_suites[0];
 
        return err;
@@ -2078,7 +2119,7 @@ wl_set_set_sharedkey(struct net_device *dev,
 
        WL_DBG(("key len (%d)\n", sme->key_len));
        if (sme->key_len) {
-               sec = wl_read_prof(wl, WL_PROF_SEC);
+               sec = wl_read_prof(wl, dev, WL_PROF_SEC);
                WL_DBG(("wpa_versions 0x%x cipher_pairwise 0x%x\n",
                        sec->wpa_versions, sec->cipher_pairwise));
                if (!(sec->wpa_versions & (NL80211_WPA_VERSION_1 |
@@ -2162,11 +2203,11 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
        }
        /* Clean BSSID */
        bzero(&bssid, sizeof(bssid));
-       wl_update_prof(wl, NULL, (void *)&bssid, WL_PROF_BSSID);
+       wl_update_prof(wl, dev, NULL, (void *)&bssid, WL_PROF_BSSID);
 
        if (IS_P2P_SSID(sme->ssid) && (dev != wl_to_prmry_ndev(wl))) {
                /* we only allow to connect using virtual interface in case of P2P */
-               if (p2p_on(wl) && is_wps_conn(sme)) {
+               if (p2p_is_on(wl) && is_wps_conn(sme)) {
                        WL_DBG(("ASSOC1 p2p index : %d sme->ie_len %d\n",
                                wl_cfgp2p_find_idx(wl, dev), sme->ie_len));
                        /* Have to apply WPS IE + P2P IE in assoc req frame */
@@ -2177,7 +2218,7 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
                                P2PAPI_BSSCFG_DEVICE).p2p_probe_req_ie_len);
                        wl_cfgp2p_set_management_ie(wl, dev, wl_cfgp2p_find_idx(wl, dev),
                                VNDR_IE_ASSOCREQ_FLAG, sme->ie, sme->ie_len);
-               } else if (p2p_on(wl) && (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2)) {
+               } else if (p2p_is_on(wl) && (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2)) {
                        /* This is the connect req after WPS is done [credentials exchanged]
                         * currently identified with WPA_VERSION_2 .
                         * Update the previously set IEs with
@@ -2278,7 +2319,7 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
        ext_join_params =  (wl_extjoin_params_t*)kzalloc(join_params_size, GFP_KERNEL);
        if (ext_join_params == NULL) {
                err = -ENOMEM;
-               wl_clr_drv_status(wl, CONNECTING);
+               wl_clr_drv_status(wl, CONNECTING, dev);
                goto exit;
        }
        ext_join_params->ssid.SSID_len = min(sizeof(ext_join_params->ssid.SSID), sme->ssid_len);
@@ -2287,12 +2328,13 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
        /* Set up join scan parameters */
        ext_join_params->scan.scan_type = -1;
        ext_join_params->scan.nprobes = 2;
-       /* increate dwell time to receive probe response
-       * from target AP at a noisy air
+       /* increate dwell time to receive probe response or detect Beacon
+       * from target AP at a noisy air only during connect command
        */
-       ext_join_params->scan.active_time = 150;
-       ext_join_params->scan.passive_time = 300;
+       ext_join_params->scan.active_time = DHD_SCAN_ACTIVE_TIME*3;
+       ext_join_params->scan.passive_time = DHD_SCAN_PASSIVE_TIME*3;
        ext_join_params->scan.home_time = -1;
+
        if (sme->bssid)
                memcpy(&ext_join_params->assoc.bssid, sme->bssid, ETH_ALEN);
        else
@@ -2317,12 +2359,12 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
                WL_INFO(("ssid \"%s\", len (%d)\n", ext_join_params->ssid.SSID,
                        ext_join_params->ssid.SSID_len));
        }
-       wl_set_drv_status(wl, CONNECTING);
+       wl_set_drv_status(wl, CONNECTING, dev);
        err = wldev_iovar_setbuf_bsscfg(dev, "join", ext_join_params, join_params_size, ioctlbuf,
                sizeof(ioctlbuf), wl_cfgp2p_find_idx(wl, dev));
        kfree(ext_join_params);
        if (err) {
-               wl_clr_drv_status(wl, CONNECTING);
+               wl_clr_drv_status(wl, CONNECTING, dev);
                if (err == BCME_UNSUPPORTED) {
                        WL_DBG(("join iovar is not supported\n"));
                        goto set_ssid;
@@ -2338,7 +2380,7 @@ set_ssid:
        join_params.ssid.SSID_len = min(sizeof(join_params.ssid.SSID), sme->ssid_len);
        memcpy(&join_params.ssid.SSID, sme->ssid, join_params.ssid.SSID_len);
        join_params.ssid.SSID_len = htod32(join_params.ssid.SSID_len);
-       wl_update_prof(wl, NULL, &join_params.ssid, WL_PROF_SSID);
+       wl_update_prof(wl, dev, NULL, &join_params.ssid, WL_PROF_SSID);
        if (sme->bssid)
                memcpy(&join_params.params.bssid, sme->bssid, ETH_ALEN);
        else
@@ -2351,11 +2393,11 @@ set_ssid:
                WL_INFO(("ssid \"%s\", len (%d)\n", join_params.ssid.SSID,
                        join_params.ssid.SSID_len));
        }
-       wl_set_drv_status(wl, CONNECTING);
+       wl_set_drv_status(wl, CONNECTING, dev);
        err = wldev_ioctl(dev, WLC_SET_SSID, &join_params, join_params_size, true);
        if (err) {
                WL_ERR(("error (%d)\n", err));
-               wl_clr_drv_status(wl, CONNECTING);
+               wl_clr_drv_status(wl, CONNECTING, dev);
        }
 exit:
        return err;
@@ -2372,23 +2414,23 @@ wl_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev,
        u8 *curbssid;
        WL_ERR(("Reason %d\n", reason_code));
        CHECK_SYS_UP(wl);
-       act = *(bool *) wl_read_prof(wl, WL_PROF_ACT);
-       curbssid = wl_read_prof(wl, WL_PROF_BSSID);
-       if (likely(act)) {
+       act = *(bool *) wl_read_prof(wl, dev, WL_PROF_ACT);
+       curbssid = wl_read_prof(wl, dev, WL_PROF_BSSID);
+       if (act) {
                /*
                * Cancel ongoing scan to sync up with sme state machine of cfg80211.
                */
                if (wl->scan_request) {
                        wl_cfg80211_scan_abort(wl, dev);
                }
-               wl_set_drv_status(wl, DISCONNECTING);
+               wl_set_drv_status(wl, DISCONNECTING, dev);
                scbval.val = reason_code;
                memcpy(&scbval.ea, curbssid, ETHER_ADDR_LEN);
                scbval.val = htod32(scbval.val);
                err = wldev_ioctl(dev, WLC_DISASSOC, &scbval,
                        sizeof(scb_val_t), true);
                if (unlikely(err)) {
-                       wl_clr_drv_status(wl, DISCONNECTING);
+                       wl_clr_drv_status(wl, DISCONNECTING, dev);
                        WL_ERR(("error (%d)\n", err));
                        return err;
                }
@@ -2507,7 +2549,7 @@ wl_add_keyext(struct wiphy *wiphy, struct net_device *dev,
        struct wl_wsec_key key;
        s32 err = 0;
        s32 bssidx = wl_cfgp2p_find_idx(wl, dev);
-       s32 mode = get_mode_by_netdev(wl, dev);
+       s32 mode = wl_get_mode_by_netdev(wl, dev);
        memset(&key, 0, sizeof(key));
        key.index = (u32) key_idx;
 
@@ -2603,7 +2645,7 @@ wl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *dev,
        u8 keybuf[8];
        s32 bssidx = 0;
        struct wl_priv *wl = wiphy_priv(wiphy);
-       s32 mode = get_mode_by_netdev(wl, dev);
+       s32 mode = wl_get_mode_by_netdev(wl, dev);
        WL_DBG(("key index (%d)\n", key_idx));
        CHECK_SYS_UP(wl);
 
@@ -2753,7 +2795,7 @@ wl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *dev,
        }
        switch (wsec & ~SES_OW_ENABLED) {
                case WEP_ENABLED:
-                       sec = wl_read_prof(wl, WL_PROF_SEC);
+                       sec = wl_read_prof(wl, dev, WL_PROF_SEC);
                        if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP40) {
                                params.cipher = WLAN_CIPHER_SUITE_WEP40;
                                WL_DBG(("WLAN_CIPHER_SUITE_WEP40\n"));
@@ -2803,7 +2845,7 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
        dhd_pub_t *dhd =  (dhd_pub_t *)(wl->pub);
 
        CHECK_SYS_UP(wl);
-       if (get_mode_by_netdev(wl, dev) == WL_MODE_AP) {
+       if (wl_get_mode_by_netdev(wl, dev) == WL_MODE_AP) {
                err = wldev_iovar_getbuf(dev, "sta_info", (struct ether_addr *)mac,
                        ETHER_ADDR_LEN, ioctlbuf, sizeof(ioctlbuf));
                if (err < 0) {
@@ -2827,10 +2869,9 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
                        bcm_ether_ntoa((const struct ether_addr *)mac, eabuf), sinfo->inactive_time,
                        sta->idle * 1000));
 #endif
-       } else if (get_mode_by_netdev(wl, dev) == WL_MODE_BSS) {
-                       u8 *curmacp = wl_read_prof(wl, WL_PROF_BSSID);
-
-                       if (!wl_get_drv_status(wl, CONNECTED) ||
+       } else if (wl_get_mode_by_netdev(wl, dev) == WL_MODE_BSS) {
+                       u8 *curmacp = wl_read_prof(wl, dev, WL_PROF_BSSID);
+                       if (!wl_get_drv_status(wl, CONNECTED, dev) ||
                            (dhd_is_associated(dhd, NULL) == FALSE)) {
                                WL_ERR(("NOT assoc\n"));
                                err = -ENODEV;
@@ -2870,7 +2911,7 @@ get_station_err:
                if (err) {
                        /* Disconnect due to zero BSSID or error to get RSSI */
                        WL_ERR(("force cfg80211_disconnected\n"));
-                       wl_clr_drv_status(wl, CONNECTED);
+                       wl_clr_drv_status(wl, CONNECTED, dev);
                        cfg80211_disconnected(dev, 0, NULL, 0, GFP_KERNEL);
                        wl_link_down(wl);
                }
@@ -2888,6 +2929,14 @@ wl_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
        struct wl_priv *wl = wiphy_priv(wiphy);
 
        CHECK_SYS_UP(wl);
+
+       if (wl->p2p_net == dev) {
+               /* Since p2p0 is a hidden interface in firmware, power
+                * mgmt doesn't apply.
+                */
+               return err;
+       }
+
        pm = enabled ? PM_FAST : PM_OFF;
        /* Do not enable the power save after assoc if it is p2p interface */
        if (wl->p2p && wl->p2p->vif_created) {
@@ -2937,11 +2986,11 @@ static __used u32 wl_find_msb(u16 bit16)
 static s32 wl_cfg80211_resume(struct wiphy *wiphy)
 {
        struct wl_priv *wl = wiphy_priv(wiphy);
+       struct net_device *ndev = wl_to_prmry_ndev(wl);
        s32 err = 0;
 
-       if (unlikely(!wl_get_drv_status(wl, READY))) {
-               WL_INFO(("device is not ready : status (%d)\n",
-                       (int)wl->status));
+       if (unlikely(!wl_get_drv_status(wl, READY, ndev))) {
+               WL_INFO(("device is not ready\n"));
                return 0;
        }
 
@@ -2958,29 +3007,34 @@ static s32 wl_cfg80211_suspend(struct wiphy *wiphy)
 {
 #ifdef DHD_CLEAR_ON_SUSPEND
        struct wl_priv *wl = wiphy_priv(wiphy);
+       struct net_info *iter, *next;
        struct net_device *ndev = wl_to_prmry_ndev(wl);
        unsigned long flags;
 
-       if (unlikely(!wl_get_drv_status(wl, READY))) {
+       if (unlikely(!wl_get_drv_status(wl, READY, ndev))) {
                WL_INFO(("device is not ready : status (%d)\n",
                        (int)wl->status));
                return 0;
        }
-
-       wl_set_drv_status(wl, SCAN_ABORTING);
+       for_each_ndev(wl, iter, next)
+               wl_set_drv_status(wl, SCAN_ABORTING, iter->ndev);
        wl_term_iscan(wl);
        flags = dhd_os_spin_lock((dhd_pub_t *)(wl->pub));
        if (wl->scan_request) {
                cfg80211_scan_done(wl->scan_request, true);
                wl->scan_request = NULL;
        }
-       wl_clr_drv_status(wl, SCANNING);
-       wl_clr_drv_status(wl, SCAN_ABORTING);
+       for_each_ndev(wl, iter, next) {
+               wl_clr_drv_status(wl, SCANNING, iter->ndev);
+               wl_clr_drv_status(wl, SCAN_ABORTING, iter->ndev);
+       }
        dhd_os_spin_unlock((dhd_pub_t *)(wl->pub), flags);
-       if (wl_get_drv_status(wl, CONNECTING)) {
-               wl_bss_connect_done(wl, ndev, NULL, NULL, false);
+       for_each_ndev(wl, iter, next) {
+               if (wl_get_drv_status(wl, CONNECTING, iter->ndev)) {
+                       wl_bss_connect_done(wl, iter->ndev, NULL, NULL, false);
+               }
        }
-#endif
+#endif /* DHD_CLEAR_ON_SUSPEND */
        return 0;
 }
 
@@ -3179,7 +3233,7 @@ wl_cfg80211_scan_abort(struct wl_priv *wl, struct net_device *ndev)
                cfg80211_scan_done(wl->scan_request, true);
                wl->scan_request = NULL;
        }
-       wl_clr_drv_status(wl, SCANNING);
+       wl_clr_drv_status(wl, SCANNING, ndev);
        dhd_os_spin_unlock((dhd_pub_t *)(wl->pub), flags);
        if (params)
                kfree(params);
@@ -3193,22 +3247,36 @@ wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev,
        unsigned int duration, u64 *cookie)
 {
        s32 target_channel;
-
+       u32 id;
+       struct net_device *ndev = NULL;
        s32 err = BCME_OK;
        struct wl_priv *wl = wiphy_priv(wiphy);
        dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub);
        WL_DBG(("Enter, netdev_ifidx: %d \n", dev->ifindex));
-       if (likely(wl_get_drv_status(wl, SCANNING))) {
+
+       if (wl->p2p_net == dev) {
+               /* Since there is no ifidx corresponding to p2p0, cmds to
+                * firmware should be routed through primary I/F
+                */
+               ndev = wl_to_prmry_ndev(wl);
+       } else {
+               ndev = dev;
+       }
+
+       if (wl_get_drv_status(wl, SCANNING, dev)) {
                wl_cfg80211_scan_abort(wl, dev);
        }
 
        target_channel = ieee80211_frequency_to_channel(channel->center_freq);
        memcpy(&wl->remain_on_chan, channel, sizeof(struct ieee80211_channel));
        wl->remain_on_chan_type = channel_type;
-       wl->cache_cookie = *cookie;
+       id = ++wl->last_roc_id;
+       if (id == 0)
+               id = ++wl->last_roc_id;
+       *cookie = id;
        cfg80211_ready_on_channel(dev, *cookie, channel,
                channel_type, duration, GFP_KERNEL);
-       if (!p2p_on(wl)) {
+       if (!p2p_is_on(wl)) {
                wl_cfgp2p_generate_bss_mac(&dhd->mac, &wl->p2p->dev_addr, &wl->p2p->int_addr);
 
                /* In case of p2p_listen command, supplicant send remain_on_channel
@@ -3222,7 +3290,7 @@ wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev,
                        goto exit;
                }
        }
-       if (p2p_on(wl))
+       if (p2p_is_on(wl))
                wl_cfgp2p_discover_listen(wl, target_channel, duration);
 
 
@@ -3240,7 +3308,7 @@ wl_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy, struct net_device *dev
 }
 
 static s32
-wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
+wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev,
        struct ieee80211_channel *channel, bool offchan,
        enum nl80211_channel_type channel_type,
        bool channel_type_valid, unsigned int wait,
@@ -3252,6 +3320,7 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
        wpa_ie_fixed_t *wps_ie;
        const struct ieee80211_mgmt *mgmt;
        struct wl_priv *wl = wiphy_priv(wiphy);
+       struct net_device *dev = NULL;
        dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub);
        s32 err = BCME_OK;
        s32 bssidx = 0;
@@ -3260,7 +3329,20 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
        u16 fc;
        bool ack = false;
        wifi_p2p_pub_act_frame_t *act_frm;
+
        WL_DBG(("Enter \n"));
+
+       if (ndev == wl->p2p_net) {
+               /* Firmware doesn't have an ifidx corresponding to p2p0 interface.
+                * so divert commands received on p2p0 to wlan0. Note that the TX status
+                * will be sent back to the interface(ndev) on which request is received
+                */
+               dev = wl_to_prmry_ndev(wl);
+       } else {
+               /* If TX req is for any valid ifidx. Use as is */
+               dev = ndev;
+       }
+
        /* find bssidx based on ndev */
        bssidx = wl_cfgp2p_find_idx(wl, dev);
        /* cookie generation */
@@ -3271,7 +3353,7 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
                WL_ERR(("Can not find the bssidx for dev( %p )\n", dev));
                return -ENODEV;
        }
-       if (wl->p2p_supported && p2p_on(wl)) {
+       if (p2p_is_on(wl)) {
                wl_cfgp2p_generate_bss_mac(&dhd->mac, &wl->p2p->dev_addr, &wl->p2p->int_addr);
                /* Suspend P2P discovery search-listen to prevent it from changing the
                 * channel.
@@ -3292,13 +3374,6 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
                                != NULL) {
                                /* Total length of P2P Information Element */
                                p2pie_len = p2p_ie->len + sizeof(p2p_ie->len) + sizeof(p2p_ie->id);
-                               /* Have to change p2p device address in dev_info attribute
-                                * because Supplicant use primary eth0 address
-                                */
-                       #ifdef ENABLE_DRIVER_CHANGE_IFADDR /* We are now doing this in supplicant */
-                               wl_cfg80211_change_ifaddr((u8 *)p2p_ie,
-                                       &wl->p2p_dev_addr, P2P_SEID_DEV_INFO);
-                       #endif
                        }
                        if ((wps_ie = wl_cfgp2p_find_wpsie((u8 *)(buf + ie_offset), ie_len))
                                != NULL) {
@@ -3314,7 +3389,7 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
                                        (u8 *)wps_ie, wpsie_len + p2pie_len);
                        }
                }
-               cfg80211_mgmt_tx_status(dev, *cookie, buf, len, true, GFP_KERNEL);
+               cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, true, GFP_KERNEL);
                goto exit;
        } else {
            /* Abort the dwell time of any previous off-channel action frame that may
@@ -3350,6 +3425,14 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
        af_params->channel =
                ieee80211_frequency_to_channel(channel->center_freq);
 
+       if (channel->band == IEEE80211_BAND_5GHZ) {
+               err = wldev_ioctl(dev, WLC_SET_CHANNEL,
+                       &af_params->channel, sizeof(af_params->channel), true);
+               if (err < 0) {
+                       WL_ERR(("WLC_SET_CHANNEL error %d\n", err));
+               }
+       }
+
        /* Add the dwell time
         * Dwell time to stay off-channel to wait for a response action frame
         * after transmitting an GO Negotiation action frame
@@ -3377,7 +3460,7 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
        }
 
        ack = (wl_cfgp2p_tx_action_frame(wl, dev, af_params, bssidx)) ? false : true;
-       cfg80211_mgmt_tx_status(dev, *cookie, buf, len, ack, GFP_KERNEL);
+       cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL);
 
        kfree(af_params);
 exit:
@@ -3432,7 +3515,14 @@ wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev,
 {
        s32 channel;
        s32 err = BCME_OK;
+       struct wl_priv *wl = wiphy_priv(wiphy);
 
+       if (wl->p2p_net == dev) {
+               /* Since there is no ifidx corresponding to p2p0, cmds to
+                * firmware should be routed through primary I/F
+                */
+               dev = wl_to_prmry_ndev(wl);
+       }
        channel = ieee80211_frequency_to_channel(chan->center_freq);
        WL_DBG(("netdev_ifidx(%d), chan_type(%d) target channel(%d) \n",
                dev->ifindex, channel_type, channel));
@@ -3713,13 +3803,22 @@ wl_cfg80211_add_set_beacon(struct wiphy *wiphy, struct net_device *dev,
        u16 p2pie_len = 0;
        u8 beacon_ie[IE_MAX_LEN];
        s32 ie_offset = 0;
-       s32 bssidx = wl_cfgp2p_find_idx(wl, dev);
+       s32 bssidx = 0;
        s32 infra = 1;
        s32 join_params_size = 0;
        s32 ap = 0;
        WL_DBG(("interval (%d) dtim_period (%d) head_len (%d) tail_len (%d)\n",
                info->interval, info->dtim_period, info->head_len, info->tail_len));
-       if (wl->p2p_supported && p2p_on(wl) &&
+
+       if (wl->p2p_net == dev) {
+               /* Since there is no ifidx corresponding to p2p0, cmds to
+                * firmware should be routed through primary I/F
+                */
+               dev = wl_to_prmry_ndev(wl);
+       }
+
+       bssidx = wl_cfgp2p_find_idx(wl, dev);
+       if (p2p_is_on(wl) &&
                (bssidx == wl_to_p2p_bss_bssidx(wl,
                P2PAPI_BSSCFG_CONNECTION))) {
                memset(beacon_ie, 0, sizeof(beacon_ie));
@@ -3757,12 +3856,6 @@ wl_cfg80211_add_set_beacon(struct wiphy *wiphy, struct net_device *dev,
                if ((p2p_ie = wl_cfgp2p_find_p2pie((u8 *)info->tail, info->tail_len)) != NULL) {
                        /* Total length of P2P Information Element */
                        p2pie_len = p2p_ie->len + sizeof(p2p_ie->len) + sizeof(p2p_ie->id);
-               #ifdef ENABLE_DRIVER_CHANGE_IFADDR /* We are now doing this in supplicant */
-                       /* Have to change device address in dev_id attribute because Supplicant
-                        * use primary eth0 address
-                        */
-                       wl_cfg80211_change_ifaddr((u8 *)p2p_ie, &wl->p2p_dev_addr, P2P_SEID_DEV_ID);
-               #endif
                        memcpy(&beacon_ie[wpsie_len], p2p_ie, p2pie_len);
 
                } else {
@@ -3802,7 +3895,7 @@ wl_cfg80211_add_set_beacon(struct wiphy *wiphy, struct net_device *dev,
                                goto exit;
                        }
                }
-       } else if (wl_get_drv_status(wl, AP_CREATING)) {
+       } else if (wl_get_drv_status(wl, AP_CREATING, dev)) {
                ie_offset = DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_FIXED_LEN;
                ap = 1;
                /* find the SSID */
@@ -3908,11 +4001,11 @@ wl_cfg80211_add_set_beacon(struct wiphy *wiphy, struct net_device *dev,
                        /* create softap */
                        if ((err = wldev_ioctl(dev, WLC_SET_SSID, &join_params,
                                join_params_size, true)) == 0) {
-                               wl_clr_drv_status(wl, AP_CREATING);
-                               wl_set_drv_status(wl, AP_CREATED);
+                               wl_clr_drv_status(wl, AP_CREATING, dev);
+                               wl_set_drv_status(wl, AP_CREATED, dev);
                        }
                }
-       } else if (wl_get_drv_status(wl, AP_CREATED)) {
+       } else if (wl_get_drv_status(wl, AP_CREATED, dev)) {
                ap = 1;
                /* find the WPSIE */
                if ((wps_ie = wl_cfgp2p_find_wpsie((u8 *)info->tail, info->tail_len)) != NULL) {
@@ -4053,7 +4146,7 @@ static struct cfg80211_ops wl_cfg80211_ops = {
        .add_beacon = wl_cfg80211_add_set_beacon,
 };
 
-static s32 wl_mode_to_nl80211_iftype(s32 mode)
+s32 wl_mode_to_nl80211_iftype(s32 mode)
 {
        s32 err = 0;
 
@@ -4142,24 +4235,15 @@ wiphy_new_out:
 
 static void wl_free_wdev(struct wl_priv *wl)
 {
-       int i;
        struct wireless_dev *wdev = wl->wdev;
-
-       if (unlikely(!wdev)) {
+       if (!wdev) {
                WL_ERR(("wdev is invalid\n"));
                return;
        }
-
-       for (i = 0; i < VWDEV_CNT; i++) {
-               if ((wl->vwdev[i] != NULL)) {
-                       kfree(wl->vwdev[i]);
-                       wl->vwdev[i] = NULL;
-               }
-       }
        wiphy_unregister(wdev->wiphy);
        wdev->wiphy->dev.parent = NULL;
        wiphy_free(wdev->wiphy);
-       kfree(wdev);
+       wl_delete_all_netinfo(wl);
 }
 
 static s32 wl_inform_bss(struct wl_priv *wl)
@@ -4339,8 +4423,10 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev,
        memset(body, 0, sizeof(body));
        memset(&bssid, 0, ETHER_ADDR_LEN);
        WL_DBG(("Enter \n"));
+       if (wl_get_mode_by_netdev(wl, ndev) == WL_INVALID)
+               return WL_INVALID;
 
-       if (get_mode_by_netdev(wl, ndev) == WL_MODE_AP) {
+       if (wl_get_mode_by_netdev(wl, ndev) == WL_MODE_AP) {
                memcpy(body, data, len);
                wldev_iovar_getbuf_bsscfg(ndev, "cur_etheraddr",
                NULL, 0, ioctlbuf, sizeof(ioctlbuf), bsscfgidx);
@@ -4401,21 +4487,20 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev,
                if (wl_is_linkup(wl, e, ndev)) {
                        wl_link_up(wl);
                        act = true;
-                       wl_update_prof(wl, e, &act, WL_PROF_ACT);
-                       wl_update_prof(wl, NULL, (void *)(e->addr.octet), WL_PROF_BSSID);
+                       wl_update_prof(wl, ndev, e, &act, WL_PROF_ACT);
+                       wl_update_prof(wl, ndev, NULL, (void *)&e->addr, WL_PROF_BSSID);
                        if (wl_is_ibssmode(wl, ndev)) {
                                printk("cfg80211_ibss_joined\n");
                                cfg80211_ibss_joined(ndev, (s8 *)&e->addr,
                                        GFP_KERNEL);
                                WL_DBG(("joined in IBSS network\n"));
                        } else {
-                               if (!wl_get_drv_status(wl, DISCONNECTING)) {
-                                       printk("wl_bss_connect_done succeeded status=(0x%x)\n",
-                                               (int)wl->status);
+                               if (!wl_get_drv_status(wl, DISCONNECTING, ndev)) {
+                                       printk("wl_bss_connect_done succeeded\n");
                                        wl_bss_connect_done(wl, ndev, e, data, true);
                                        WL_DBG(("joined in BSS network \"%s\"\n",
                                        ((struct wlc_ssid *)
-                                        wl_read_prof(wl, WL_PROF_SSID))->SSID));
+                                        wl_read_prof(wl, ndev, WL_PROF_SSID))->SSID));
                                }
                        }
 
@@ -4423,15 +4508,15 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev,
                        if (wl->scan_request) {
                                del_timer_sync(&wl->scan_timeout);
                                if (wl->escan_on) {
-                                       wl_notify_escan_complete(wl, true);
+                                       wl_notify_escan_complete(wl, ndev, true);
                                } else
                                        wl_iscan_aborted(wl);
                        }
-                       if (wl_get_drv_status(wl, CONNECTED)) {
+                       if (wl_get_drv_status(wl, CONNECTED, ndev)) {
                                scb_val_t scbval;
-                               u8 *curbssid = wl_read_prof(wl, WL_PROF_BSSID);
+                               u8 *curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID);
                                printk("link down, call cfg80211_disconnected\n");
-                               wl_clr_drv_status(wl, CONNECTED);
+                               wl_clr_drv_status(wl, CONNECTED, ndev);
                                /* To make sure disconnect, explictly send dissassoc
                                *  for BSSID 00:00:00:00:00:00 issue
                                */
@@ -4443,12 +4528,12 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev,
                                        sizeof(scb_val_t), true);
                                cfg80211_disconnected(ndev, 0, NULL, 0, GFP_KERNEL);
                                wl_link_down(wl);
-                               wl_init_prof(wl);
-                       } else if (wl_get_drv_status(wl, CONNECTING)) {
+                               wl_init_prof(wl, ndev);
+                       } else if (wl_get_drv_status(wl, CONNECTING, ndev)) {
                                printk("link down, during connecting\n");
                                wl_bss_connect_done(wl, ndev, e, data, false);
                        }
-                       wl_clr_drv_status(wl, DISCONNECTING);
+                       wl_clr_drv_status(wl, DISCONNECTING, ndev);
 
                } else if (wl_is_nonetwork(wl, e)) {
                        printk("connect failed event=%d e->status 0x%x\n",
@@ -4457,11 +4542,11 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev,
                        if (wl->scan_request) {
                                del_timer_sync(&wl->scan_timeout);
                                if (wl->escan_on) {
-                                       wl_notify_escan_complete(wl, true);
+                                       wl_notify_escan_complete(wl, ndev, true);
                                } else
                                        wl_iscan_aborted(wl);
                        }
-                       if (wl_get_drv_status(wl, CONNECTING))
+                       if (wl_get_drv_status(wl, CONNECTING, ndev))
                                wl_bss_connect_done(wl, ndev, e, data, false);
                } else {
                        printk("%s nothing\n", __FUNCTION__);
@@ -4483,13 +4568,13 @@ wl_notify_roaming_status(struct wl_priv *wl, struct net_device *ndev,
        u32 status = be32_to_cpu(e->status);
        WL_DBG(("Enter \n"));
        if (event == WLC_E_ROAM && status == WLC_E_STATUS_SUCCESS) {
-               if (wl_get_drv_status(wl, CONNECTED))
+               if (wl_get_drv_status(wl, CONNECTED, ndev))
                        wl_bss_roaming_done(wl, ndev, e, data);
                else
                        wl_bss_connect_done(wl, ndev, e, data, true);
                act = true;
-               wl_update_prof(wl, e, &act, WL_PROF_ACT);
-               wl_update_prof(wl, NULL, (void *)(e->addr.octet), WL_PROF_BSSID);
+               wl_update_prof(wl, ndev, e, &act, WL_PROF_ACT);
+               wl_update_prof(wl, ndev, NULL, (void *)&e->addr, WL_PROF_BSSID);
        }
        return err;
 }
@@ -4649,14 +4734,14 @@ static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev)
        if (wl_is_ibssmode(wl, ndev))
                return err;
 
-       ssid = (struct wlc_ssid *)wl_read_prof(wl, WL_PROF_SSID);
-       curbssid = wl_read_prof(wl, WL_PROF_BSSID);
+       ssid = (struct wlc_ssid *)wl_read_prof(wl, ndev, WL_PROF_SSID);
+       curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID);
        bss = cfg80211_get_bss(wiphy, NULL, curbssid,
                ssid->SSID, ssid->SSID_len, WLAN_CAPABILITY_ESS,
                WLAN_CAPABILITY_ESS);
 
        mutex_lock(&wl->usr_sync);
-       if (unlikely(!bss)) {
+       if (!bss) {
                WL_DBG(("Could not find the AP\n"));
                *(u32 *) wl->extra_buf = htod32(WL_EXTRA_BUF_MAX);
                err = wldev_ioctl(ndev, WLC_GET_BSS_INFO,
@@ -4702,8 +4787,8 @@ static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev)
                }
        }
 
-       wl_update_prof(wl, NULL, &beacon_interval, WL_PROF_BEACONINT);
-       wl_update_prof(wl, NULL, &dtim_period, WL_PROF_DTIMPERIOD);
+       wl_update_prof(wl, ndev, NULL, &beacon_interval, WL_PROF_BEACONINT);
+       wl_update_prof(wl, ndev, NULL, &dtim_period, WL_PROF_DTIMPERIOD);
 
 update_bss_info_out:
        mutex_unlock(&wl->usr_sync);
@@ -4719,8 +4804,8 @@ wl_bss_roaming_done(struct wl_priv *wl, struct net_device *ndev,
        u8 *curbssid;
 
        wl_get_assoc_ies(wl, ndev);
-       wl_update_prof(wl, NULL, (void *)(e->addr.octet), WL_PROF_BSSID);
-       curbssid = wl_read_prof(wl, WL_PROF_BSSID);
+       wl_update_prof(wl, ndev, NULL, (void *)(e->addr.octet), WL_PROF_BSSID);
+       curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID);
        wl_update_bss_info(wl, ndev);
        wl_update_pmklist(ndev, wl->pmk_list, err);
        cfg80211_roamed(ndev,
@@ -4732,7 +4817,7 @@ wl_bss_roaming_done(struct wl_priv *wl, struct net_device *ndev,
                conn_info->resp_ie, conn_info->resp_ie_len, GFP_KERNEL);
        WL_DBG(("Report roaming result\n"));
 
-       wl_set_drv_status(wl, CONNECTED);
+       wl_set_drv_status(wl, CONNECTED, ndev);
 
        return err;
 }
@@ -4743,20 +4828,20 @@ wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev,
 {
        struct wl_connect_info *conn_info = wl_to_conn(wl);
        s32 err = 0;
-       u8 *curbssid = wl_read_prof(wl, WL_PROF_BSSID);
+       u8 *curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID);
        WL_DBG((" enter\n"));
        if (wl->scan_request) {
                wl_cfg80211_scan_abort(wl, ndev);
        }
-       if (wl_get_drv_status(wl, CONNECTING)) {
-               wl_clr_drv_status(wl, CONNECTING);
+       if (wl_get_drv_status(wl, CONNECTING, ndev)) {
+               wl_clr_drv_status(wl, CONNECTING, ndev);
                if (completed) {
                        wl_get_assoc_ies(wl, ndev);
-                       wl_update_prof(wl, NULL, (void *)(e->addr.octet), WL_PROF_BSSID);
-                       curbssid = wl_read_prof(wl, WL_PROF_BSSID);
+                       wl_update_prof(wl, ndev, NULL, (void *)(e->addr.octet), WL_PROF_BSSID);
+                       curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID);
                        wl_update_bss_info(wl, ndev);
                        wl_update_pmklist(ndev, wl->pmk_list, err);
-                       wl_set_drv_status(wl, CONNECTED);
+                       wl_set_drv_status(wl, CONNECTED, ndev);
                }
                cfg80211_connect_result(ndev,
                        curbssid,
@@ -4818,11 +4903,15 @@ wl_notify_scan_status(struct wl_priv *wl, struct net_device *ndev,
        unsigned long flags;
 
        WL_DBG(("Enter \n"));
+       if (!wl_get_drv_status(wl, SCANNING, ndev)) {
+               WL_ERR(("scan is not ready \n"));
+               return err;
+       }
        if (wl->iscan_on && wl->iscan_kickstart)
                return wl_wakeup_iscan(wl_to_iscan(wl));
 
        mutex_lock(&wl->usr_sync);
-       wl_clr_drv_status(wl, SCANNING);
+       wl_clr_drv_status(wl, SCANNING, ndev);
        err = wldev_ioctl(ndev, WLC_GET_CHANNEL, &channel_inform,
                sizeof(channel_inform), false);
        if (unlikely(err)) {
@@ -4915,6 +5004,7 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev,
        bool isfree = false;
        s32 err = 0;
        s32 freq;
+       struct net_device *dev = NULL;
        wifi_p2p_pub_act_frame_t *act_frm;
        wl_event_rx_frame_data_t *rxframe =
                (wl_event_rx_frame_data_t*)data;
@@ -4925,6 +5015,16 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev,
        u16 channel = ((ntoh16(rxframe->channel) & WL_CHANSPEC_CHAN_MASK));
 
        memset(&bssid, 0, ETHER_ADDR_LEN);
+
+       if (wl->p2p_net == ndev) {
+               /* Since there is no ifidx corresponding to p2p0, cmds to
+                * firmware should be routed through primary I/F
+                */
+               dev = wl_to_prmry_ndev(wl);
+       } else {
+               dev = ndev;
+       }
+
        if (channel <= CH_MAX_2G_CHANNEL)
                band = wiphy->bands[IEEE80211_BAND_2GHZ];
        else
@@ -4936,10 +5036,10 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev,
        freq = ieee80211_channel_to_frequency(channel, band->band);
 #endif
        if (event == WLC_E_ACTION_FRAME_RX) {
-               wldev_iovar_getbuf_bsscfg(ndev, "cur_etheraddr",
+               wldev_iovar_getbuf_bsscfg(dev, "cur_etheraddr",
                NULL, 0, ioctlbuf, sizeof(ioctlbuf), bsscfgidx);
 
-               wldev_ioctl(ndev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false);
+               wldev_ioctl(dev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false);
                memcpy(da.octet, ioctlbuf, ETHER_ADDR_LEN);
                err = wl_frame_get_mgmt(FC_ACTION, &da, &e->addr, &bssid,
                        &mgmt_frame, &mgmt_frame_len,
@@ -4956,7 +5056,7 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev,
                 * After complete GO Negotiation, roll back to mpc mode
                 */
                 if (act_frm->subtype == P2P_PAF_GON_CONF) {
-                       wldev_iovar_setint(ndev, "mpc", 1);
+                       wldev_iovar_setint(dev, "mpc", 1);
                }
        } else {
                mgmt_frame = (u8 *)((wl_event_rx_frame_data_t *)rxframe + 1);
@@ -4975,12 +5075,7 @@ exit:
 
 static void wl_init_conf(struct wl_conf *conf)
 {
-       s32 i = 0;
        WL_DBG(("Enter \n"));
-       for (i = 0; i <= VWDEV_CNT; i++) {
-               conf->mode[i].type = -1;
-               conf->mode[i].ndev = NULL;
-       }
        conf->frag_threshold = (u32)-1;
        conf->rts_threshold = (u32)-1;
        conf->retry_short = (u32)-1;
@@ -4988,12 +5083,12 @@ static void wl_init_conf(struct wl_conf *conf)
        conf->tx_power = -1;
 }
 
-static void wl_init_prof(struct wl_priv *wl)
+static void wl_init_prof(struct wl_priv *wl, struct net_device *ndev)
 {
        unsigned long flags;
-
+       struct wl_profile *profile = wl_get_profile_by_netdev(wl, ndev);
        flags = dhd_os_spin_lock((dhd_pub_t *)(wl->pub));
-       memset(wl->profile, 0, sizeof(struct wl_profile));
+       memset(profile, 0, sizeof(struct wl_profile));
        dhd_os_spin_unlock((dhd_pub_t *)(wl->pub), flags);
 }
 
@@ -5033,16 +5128,6 @@ static s32 wl_init_priv_mem(struct wl_priv *wl)
                WL_ERR(("wl_conf alloc failed\n"));
                goto init_priv_mem_out;
        }
-       wl->profile = (void *)kzalloc(sizeof(*wl->profile), GFP_KERNEL);
-       if (unlikely(!wl->profile)) {
-               WL_ERR(("wl_profile alloc failed\n"));
-               goto init_priv_mem_out;
-       }
-       wl->bss_info = (void *)kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL);
-       if (unlikely(!wl->bss_info)) {
-               WL_ERR(("Bss information alloc failed\n"));
-               goto init_priv_mem_out;
-       }
        wl->scan_req_int =
            (void *)kzalloc(sizeof(*wl->scan_req_int), GFP_KERNEL);
        if (unlikely(!wl->scan_req_int)) {
@@ -5096,12 +5181,8 @@ static void wl_deinit_priv_mem(struct wl_priv *wl)
 {
        kfree(wl->scan_results);
        wl->scan_results = NULL;
-       kfree(wl->bss_info);
-       wl->bss_info = NULL;
        kfree(wl->conf);
        wl->conf = NULL;
-       kfree(wl->profile);
-       wl->profile = NULL;
        kfree(wl->scan_req_int);
        wl->scan_req_int = NULL;
        kfree(wl->ioctl_buf);
@@ -5162,16 +5243,17 @@ static void wl_term_iscan(struct wl_priv *wl)
 static void wl_notify_iscan_complete(struct wl_iscan_ctrl *iscan, bool aborted)
 {
        struct wl_priv *wl = iscan_to_wl(iscan);
+       struct net_device *ndev = wl_to_prmry_ndev(wl);
        unsigned long flags;
 
        WL_DBG(("Enter \n"));
-       if (unlikely(!wl_get_drv_status(wl, SCANNING))) {
-               wl_clr_drv_status(wl, SCANNING);
+       if (!wl_get_drv_status(wl, SCANNING, ndev)) {
+               wl_clr_drv_status(wl, SCANNING, ndev);
                WL_ERR(("Scan complete while device not scanning\n"));
                return;
        }
        flags = dhd_os_spin_lock((dhd_pub_t *)(wl->pub));
-       wl_clr_drv_status(wl, SCANNING);
+       wl_clr_drv_status(wl, SCANNING, ndev);
        if (likely(wl->scan_request)) {
                cfg80211_scan_done(wl->scan_request, aborted);
                wl->scan_request = NULL;
@@ -5326,7 +5408,7 @@ static void wl_scan_timeout(unsigned long data)
        if (wl->scan_request) {
                WL_ERR(("timer expired\n"));
                if (wl->escan_on)
-                       wl_notify_escan_complete(wl, true);
+                       wl_notify_escan_complete(wl, wl->escan_info.ndev, true);
                else
                        wl_notify_iscan_complete(wl_to_iscan(wl), true);
        }
@@ -5372,13 +5454,39 @@ static void wl_init_iscan_handler(struct wl_iscan_ctrl *iscan)
        iscan->iscan_handler[WL_SCAN_RESULTS_NO_MEM] = wl_iscan_aborted;
 }
 
-static void wl_notify_escan_complete(struct wl_priv *wl, bool aborted)
+static s32
+wl_cfg80211_netdev_notifier_call(struct notifier_block * nb,
+       unsigned long state,
+       void *ndev)
+{
+       struct net_device *dev = ndev;
+       struct wireless_dev *wdev = dev->ieee80211_ptr;
+       struct wl_priv *wl = wlcfg_drv_priv;
+
+       WL_DBG(("Enter \n"));
+       if (!wdev || dev == wl_to_prmry_ndev(wl))
+               return NOTIFY_DONE;
+       switch (state) {
+               case NETDEV_UNREGISTER:
+                               /* after calling list_del_rcu(&wdev->list) */
+                               wl_dealloc_netinfo(wl, ndev);
+                               break;
+       }
+       return NOTIFY_DONE;
+}
+static struct notifier_block wl_cfg80211_netdev_notifier = {
+       .notifier_call = wl_cfg80211_netdev_notifier_call,
+};
+
+static void wl_notify_escan_complete(struct wl_priv *wl,
+       struct net_device *ndev,
+       bool aborted)
 {
        unsigned long flags;
 
        WL_DBG(("Enter \n"));
-       wl_clr_drv_status(wl, SCANNING);
-       if (wl->p2p_supported && p2p_on(wl))
+       wl_clr_drv_status(wl, SCANNING, ndev);
+       if (p2p_is_on(wl))
                wl_clr_p2p_status(wl, SCANNING);
 
        flags = dhd_os_spin_lock((dhd_pub_t *)(wl->pub));
@@ -5403,8 +5511,11 @@ static s32 wl_escan_handler(struct wl_priv *wl,
        u32 i;
        WL_DBG((" enter event type : %d, status : %d \n",
                ntoh32(e->event_type), ntoh32(e->status)));
-       if (!wl->escan_on &&
-               !wl_get_drv_status(wl, SCANNING)) {
+       /* P2P SCAN is coming from primary interface */
+       if (wl_get_p2p_status(wl, SCANNING))
+               ndev = wl->escan_info.ndev;
+       if (!ndev || !wl->escan_on ||
+               !wl_get_drv_status(wl, SCANNING, ndev)) {
                WL_ERR(("escan is not ready \n"));
                return err;
        }
@@ -5476,7 +5587,7 @@ static s32 wl_escan_handler(struct wl_priv *wl,
                        WL_INFO(("ESCAN COMPLETED\n"));
                        wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf;
                        wl_inform_bss(wl);
-                       wl_notify_escan_complete(wl, false);
+                       wl_notify_escan_complete(wl, ndev, false);
                        mutex_unlock(&wl->usr_sync);
                }
        }
@@ -5488,7 +5599,7 @@ static s32 wl_escan_handler(struct wl_priv *wl,
                        WL_INFO(("ESCAN ABORTED\n"));
                        wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf;
                        wl_inform_bss(wl);
-                       wl_notify_escan_complete(wl, true);
+                       wl_notify_escan_complete(wl, ndev, true);
                        mutex_unlock(&wl->usr_sync);
                }
        }
@@ -5500,7 +5611,7 @@ static s32 wl_escan_handler(struct wl_priv *wl,
                        del_timer_sync(&wl->scan_timeout);
                        wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf;
                        wl_inform_bss(wl);
-                       wl_notify_escan_complete(wl, true);
+                       wl_notify_escan_complete(wl, ndev, true);
                        mutex_unlock(&wl->usr_sync);
                }
        }
@@ -5549,9 +5660,8 @@ static void wl_init_fw(struct wl_fw_ctrl *fw)
 static s32 wl_init_priv(struct wl_priv *wl)
 {
        struct wiphy *wiphy = wl_to_wiphy(wl);
+       struct net_device *ndev = wl_to_prmry_ndev(wl);
        s32 err = 0;
-       s32 i = 0;
-
        wl->scan_request = NULL;
        wl->pwr_save = !!(wiphy->flags & WIPHY_FLAG_PS_ON_BY_DEFAULT);
        wl->iscan_on = false;
@@ -5562,24 +5672,21 @@ static s32 wl_init_priv(struct wl_priv *wl)
        wl->dongle_up = false;
        wl->rf_blocked = false;
 
-       for (i = 0; i < VWDEV_CNT; i++)
-               wl->vwdev[i] = NULL;
-
        init_waitqueue_head(&wl->dongle_event_wait);
        wl_init_eq(wl);
        err = wl_init_priv_mem(wl);
-       if (unlikely(err))
+       if (err)
                return err;
-       if (unlikely(wl_create_event_handler(wl)))
+       if (wl_create_event_handler(wl))
                return -ENOMEM;
        wl_init_event_handler(wl);
        mutex_init(&wl->usr_sync);
        err = wl_init_scan(wl);
-       if (unlikely(err))
+       if (err)
                return err;
        wl_init_fw(wl->fw);
        wl_init_conf(wl->conf);
-       wl_init_prof(wl);
+       wl_init_prof(wl, ndev);
        wl_link_down(wl);
 
        return err;
@@ -5594,25 +5701,45 @@ static void wl_deinit_priv(struct wl_priv *wl)
        del_timer_sync(&wl->scan_timeout);
        wl_term_iscan(wl);
        wl_deinit_priv_mem(wl);
+       unregister_netdevice_notifier(&wl_cfg80211_netdev_notifier);
 }
 
-#if defined(DHD_P2P_DEV_ADDR_FROM_SYSFS) && defined(CONFIG_SYSCTL)
-s32 wl_cfg80211_sysctl_export_devaddr(void *data)
+#if defined(WLP2P) && ENABLE_P2P_INTERFACE
+static s32 wl_cfg80211_attach_p2p(void)
+{
+       struct wl_priv *wl = wlcfg_drv_priv;
+
+       WL_TRACE(("Enter \n"));
+
+       if (wl_cfgp2p_register_ndev(wl) < 0) {
+               WL_ERR(("%s: P2P attach failed. \n", __func__));
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
+static s32  wl_cfg80211_detach_p2p(void)
 {
-       /* Export the p2p_dev_addr via sysctl interface
-        * so that wpa_supplicant can access it
-        */
-       dhd_pub_t *dhd = (dhd_pub_t *)data;
        struct wl_priv *wl = wlcfg_drv_priv;
+       struct wireless_dev *wdev = wl->p2p_wdev;
+
+       WL_TRACE(("Enter \n"));
+       if (!wdev || !wl) {
+               WL_ERR(("Invalid Ptr\n"));
+               return -EINVAL;
+       }
+
+       wl_cfgp2p_unregister_ndev(wl);
 
-       wl_cfgp2p_generate_bss_mac(&dhd->mac, &wl->p2p->dev_addr, &wl->p2p->int_addr);
+       wl->p2p_wdev = NULL;
+       wl->p2p_net = NULL;
 
-       sprintf((char *)&wl_sysctl_macstring[0], MACSTR, MAC2STR(wl->p2p->dev_addr.octet));
-       sprintf((char *)&wl_sysctl_macstring[1], MACSTR, MAC2STR(wl->p2p->int_addr.octet));
+       kfree(wdev);
 
        return 0;
 }
-#endif /* CONFIG_SYSCTL */
+#endif /* defined(WLP2P) && (ENABLE_P2P_INTERFACE) */
 
 s32 wl_cfg80211_attach_post(struct net_device *ndev)
 {
@@ -5624,7 +5751,7 @@ s32 wl_cfg80211_attach_post(struct net_device *ndev)
                return -ENODEV;
        }
        wl = wlcfg_drv_priv;
-       if (wl && !wl_get_drv_status(wl, READY)) {
+       if (wl && !wl_get_drv_status(wl, READY, ndev)) {
                        if (wl->wdev &&
                                wl_cfgp2p_supported(wl, ndev)) {
                                wl->wdev->wiphy->interface_modes |=
@@ -5632,67 +5759,90 @@ s32 wl_cfg80211_attach_post(struct net_device *ndev)
                                        BIT(NL80211_IFTYPE_P2P_GO));
                                if ((err = wl_cfgp2p_init_priv(wl)) != 0)
                                        goto fail;
-#if defined(DHD_P2P_DEV_ADDR_FROM_SYSFS) && defined(CONFIG_SYSCTL)
-                               wl_cfg80211_sysctl_export_devaddr(wl->pub);
-#endif
+
+#if defined(WLP2P) && ENABLE_P2P_INTERFACE
+                               if (wl->p2p_net) {
+                                       /* Update MAC addr for p2p0 interface here. */
+                                       memcpy(wl->p2p_net->dev_addr, ndev->dev_addr, ETH_ALEN);
+                                       wl->p2p_net->dev_addr[0] |= 0x02;
+                                       printk("%s: p2p_dev_addr="MACSTR "\n",
+                                               wl->p2p_net->name, MAC2STR(wl->p2p_net->dev_addr));
+                               } else {
+                                       WL_ERR(("p2p_net not yet populated."
+                                       " Couldn't update the MAC Address for p2p0 \n"));
+                                       return -ENODEV;
+                               }
+#endif /* defined(WLP2P) && (ENABLE_P2P_INTERFACE) */
+
                                wl->p2p_supported = true;
                        }
        } else
                return -ENODEV;
-
-       wl_set_drv_status(wl, READY);
+       wl_set_drv_status(wl, READY, ndev);
 fail:
        return err;
 }
+
 s32 wl_cfg80211_attach(struct net_device *ndev, void *data)
 {
        struct wireless_dev *wdev;
        struct wl_priv *wl;
        s32 err = 0;
+       struct device *dev;
 
        WL_TRACE(("In\n"));
-       if (unlikely(!ndev)) {
+       if (!ndev) {
                WL_ERR(("ndev is invaild\n"));
                return -ENODEV;
        }
-       WL_DBG(("func %p\n", wl_cfg80211_get_sdio_func()));
-       wdev = wl_alloc_wdev(&wl_cfg80211_get_sdio_func()->dev);
-       if (unlikely(IS_ERR(wdev)))
+       WL_DBG(("func %p\n", wl_cfg80211_get_parent_dev()));
+       dev = wl_cfg80211_get_parent_dev();
+       wdev = wl_alloc_wdev(dev);
+       if (IS_ERR(wdev))
                return -ENOMEM;
 
        wdev->iftype = wl_mode_to_nl80211_iftype(WL_MODE_BSS);
        wl = (struct wl_priv *)wiphy_priv(wdev->wiphy);
        wl->wdev = wdev;
        wl->pub = data;
-
+       INIT_LIST_HEAD(&wl->net_list);
        ndev->ieee80211_ptr = wdev;
        SET_NETDEV_DEV(ndev, wiphy_dev(wdev->wiphy));
        wdev->netdev = ndev;
-
+       err = wl_alloc_netinfo(wl, ndev, wdev, WL_MODE_BSS);
+       if (err) {
+               WL_ERR(("Failed to alloc net_info (%d)\n", err));
+               goto cfg80211_attach_out;
+       }
        err = wl_init_priv(wl);
-       if (unlikely(err)) {
+       if (err) {
                WL_ERR(("Failed to init iwm_priv (%d)\n", err));
                goto cfg80211_attach_out;
        }
 
        err = wl_setup_rfkill(wl, TRUE);
-       if (unlikely(err)) {
+       if (err) {
                WL_ERR(("Failed to setup rfkill %d\n", err));
                goto cfg80211_attach_out;
        }
-
-#if defined(DHD_P2P_DEV_ADDR_FROM_SYSFS) && defined(CONFIG_SYSCTL)
-       if (!(wl_sysctl_hdr = register_sysctl_table(wl_sysctl_table))) {
-               WL_ERR(("%s: sysctl register failed!! \n", __func__));
+       err = register_netdevice_notifier(&wl_cfg80211_netdev_notifier);
+       if (err) {
+               WL_ERR(("Failed to register notifierl %d\n", err));
                goto cfg80211_attach_out;
        }
-#endif
 #if defined(COEX_DHCP)
        if (wl_cfg80211_btcoex_init(wl))
                goto cfg80211_attach_out;
 #endif /* COEX_DHCP */
 
        wlcfg_drv_priv = wl;
+
+#if defined(WLP2P) && ENABLE_P2P_INTERFACE
+       err = wl_cfg80211_attach_p2p();
+       if (err)
+               goto cfg80211_attach_out;
+#endif
+
        return err;
 
 cfg80211_attach_out:
@@ -5713,16 +5863,15 @@ void wl_cfg80211_detach(void)
        wl_cfg80211_btcoex_deinit(wl);
 #endif /* COEX_DHCP */
 
-#if defined(DHD_P2P_DEV_ADDR_FROM_SYSFS) && defined(CONFIG_SYSCTL)
-       if (wl_sysctl_hdr)
-               unregister_sysctl_table(wl_sysctl_hdr);
+#if defined(WLP2P) && ENABLE_P2P_INTERFACE
+       wl_cfg80211_detach_p2p();
 #endif
        wl_setup_rfkill(wl, FALSE);
        if (wl->p2p_supported)
                wl_cfgp2p_deinit_priv(wl);
        wl_deinit_priv(wl);
        wlcfg_drv_priv = NULL;
-       wl_clear_sdio_func();
+       wl_cfg80211_clear_parent_dev();
        wl_free_wdev(wl);
 }
 
@@ -5734,6 +5883,42 @@ static void wl_wakeup_event(struct wl_priv *wl)
        }
 }
 
+static int wl_is_p2p_event(struct wl_event_q *e)
+{
+       switch (e->etype) {
+       /* We have to seperate out the P2P events received
+        * on primary interface so that it can be send up
+        * via p2p0 interface.
+       */
+       case WLC_E_P2P_PROBREQ_MSG:
+       case WLC_E_P2P_DISC_LISTEN_COMPLETE:
+       case WLC_E_ACTION_FRAME_RX:
+       case WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE:
+       case WLC_E_ACTION_FRAME_COMPLETE:
+
+               if (e->emsg.ifidx != 0) {
+                       WL_TRACE(("P2P Event on Virtual I/F (ifidx:%d) \n",
+                       e->emsg.ifidx));
+                       /* We are only bothered about the P2P events received
+                        * on primary interface. For rest of them return false
+                        * so that it is sent over the interface corresponding
+                        * to the ifidx.
+                        */
+                       return FALSE;
+               } else {
+                       WL_TRACE(("P2P Event on Primary I/F (ifidx:%d)."
+                               " Sent it to p2p0 \n", e->emsg.ifidx));
+                       return TRUE;
+               }
+               break;
+
+       default:
+               WL_TRACE(("NON-P2P Event %d on ifidx (ifidx:%d) \n",
+                       e->etype, e->emsg.ifidx));
+               return FALSE;
+       }
+}
+
 static s32 wl_event_handler(void *data)
 {
        struct net_device *netdev;
@@ -5750,9 +5935,20 @@ static s32 wl_event_handler(void *data)
                        break;
                while ((e = wl_deq_event(wl))) {
                        WL_DBG(("event type (%d), if idx: %d\n", e->etype, e->emsg.ifidx));
-                       netdev = dhd_idx2net((struct dhd_pub *)(wl->pub), e->emsg.ifidx);
-                       if (!netdev)
-                               netdev = wl_to_prmry_ndev(wl);
+
+                       /* All P2P device address related events comes on primary interface since
+                        * there is no corresponding interface in the firmware. Map it to p2p0
+                        * interface.
+                        */
+                       if ((wl_is_p2p_event(e) == TRUE) && (wl->p2p_net)) {
+                               netdev = wl->p2p_net;
+                       } else {
+                               netdev = dhd_idx2net((struct dhd_pub *)(wl->pub), e->emsg.ifidx);
+                               if (!netdev) {
+                                       netdev = wl_to_prmry_ndev(wl);
+                               }
+                       }
+
                        if (e->etype < WLC_E_LAST && wl->evt_handler[e->etype]) {
                                wl->evt_handler[e->etype] (wl, netdev, &e->emsg, e->edata);
                        } else {
@@ -5863,21 +6059,6 @@ static void wl_put_event(struct wl_event_q *e)
        kfree(e);
 }
 
-void wl_cfg80211_set_sdio_func(void *func)
-{
-       cfg80211_sdio_func = (struct sdio_func *)func;
-}
-
-static void wl_clear_sdio_func(void)
-{
-       cfg80211_sdio_func = NULL;
-}
-
-struct sdio_func *wl_cfg80211_get_sdio_func(void)
-{
-       return cfg80211_sdio_func;
-}
-
 static s32 wl_dongle_mode(struct wl_priv *wl, struct net_device *ndev, s32 iftype)
 {
        s32 infra = 0;
@@ -5915,7 +6096,7 @@ static s32 wl_dongle_mode(struct wl_priv *wl, struct net_device *ndev, s32 iftyp
                return err;
        }
 
-       set_mode_by_netdev(wl, ndev, mode);
+       wl_set_mode_by_netdev(wl, ndev, mode);
 
        return 0;
 }
@@ -6279,14 +6460,11 @@ s32 wl_config_dongle(struct wl_priv *wl, bool need_lock)
                goto default_conf_out;
        }
 
-       /* -EINPROGRESS: Call commit handler */
-
+       wl->dongle_up = true;
 default_conf_out:
        if (need_lock)
                rtnl_unlock();
 
-       wl->dongle_up = true;
-
        return err;
 
 }
@@ -6318,16 +6496,16 @@ static s32 wl_update_wiphybands(struct wl_priv *wl)
 static s32 __wl_cfg80211_up(struct wl_priv *wl)
 {
        s32 err = 0;
-
+       struct net_device *ndev = wl_to_prmry_ndev(wl);
        WL_TRACE(("In\n"));
-       wl_debugfs_add_netdev_params(wl);
+       wl_debugfs_add_netdev_params(wl, ndev);
 
        err = wl_config_dongle(wl, false);
        if (unlikely(err))
                return err;
        dhd_monitor_init(wl->pub);
        wl_invoke_iscan(wl);
-       wl_set_drv_status(wl, READY);
+       wl_set_drv_status(wl, READY, ndev);
        return err;
 }
 
@@ -6335,13 +6513,14 @@ static s32 __wl_cfg80211_down(struct wl_priv *wl)
 {
        s32 err = 0;
        unsigned long flags;
-
+       struct net_info *iter, *next;
+       struct net_device *ndev = wl_to_prmry_ndev(wl);
        WL_TRACE(("In\n"));
        /* Check if cfg80211 interface is already down */
-       if (!wl_get_drv_status(wl, READY))
+       if (!wl_get_drv_status(wl, READY, ndev))
                return err;     /* it is even not ready */
-
-       wl_set_drv_status(wl, SCAN_ABORTING);
+       for_each_ndev(wl, iter, next)
+               wl_set_drv_status(wl, SCAN_ABORTING, iter->ndev);
 
        wl_term_iscan(wl);
        flags = dhd_os_spin_lock((dhd_pub_t *)(wl->pub));
@@ -6349,15 +6528,15 @@ static s32 __wl_cfg80211_down(struct wl_priv *wl)
                cfg80211_scan_done(wl->scan_request, true);
                wl->scan_request = NULL;
        }
-       wl_clr_drv_status(wl, READY);
-       wl_clr_drv_status(wl, SCANNING);
-       wl_clr_drv_status(wl, SCAN_ABORTING);
-       wl_clr_drv_status(wl, CONNECTING);
-       wl_clr_drv_status(wl, CONNECTED);
-       wl_clr_drv_status(wl, DISCONNECTING);
-       if (wl_get_drv_status(wl, AP_CREATED)) {
-               wl_clr_drv_status(wl, AP_CREATED);
-               wl_clr_drv_status(wl, AP_CREATING);
+       for_each_ndev(wl, iter, next) {
+               wl_clr_drv_status(wl, READY, iter->ndev);
+               wl_clr_drv_status(wl, SCANNING, iter->ndev);
+               wl_clr_drv_status(wl, SCAN_ABORTING, iter->ndev);
+               wl_clr_drv_status(wl, CONNECTING, iter->ndev);
+               wl_clr_drv_status(wl, CONNECTED, iter->ndev);
+               wl_clr_drv_status(wl, DISCONNECTING, iter->ndev);
+               wl_clr_drv_status(wl, AP_CREATED, iter->ndev);
+               wl_clr_drv_status(wl, AP_CREATING, iter->ndev);
        }
        wl_to_prmry_ndev(wl)->ieee80211_ptr->iftype =
                NL80211_IFTYPE_STATION;
@@ -6431,24 +6610,26 @@ static s32 wl_dongle_probecap(struct wl_priv *wl)
        return err;
 }
 
-static void *wl_read_prof(struct wl_priv *wl, s32 item)
+static void *wl_read_prof(struct wl_priv *wl, struct net_device *ndev, s32 item)
 {
        unsigned long flags;
        void *rptr = NULL;
-
+       struct wl_profile *profile = wl_get_profile_by_netdev(wl, ndev);
+       if (!profile)
+               return NULL;
        flags = dhd_os_spin_lock((dhd_pub_t *)(wl->pub));
        switch (item) {
        case WL_PROF_SEC:
-               rptr = &wl->profile->sec;
+               rptr = &profile->sec;
                break;
        case WL_PROF_ACT:
-               rptr = &wl->profile->active;
+               rptr = &profile->active;
                break;
        case WL_PROF_BSSID:
-               rptr = &wl->profile->bssid;
+               rptr = profile->bssid;
                break;
        case WL_PROF_SSID:
-               rptr = &wl->profile->ssid;
+               rptr = &profile->ssid;
                break;
        }
        dhd_os_spin_unlock((dhd_pub_t *)(wl->pub), flags);
@@ -6458,39 +6639,41 @@ static void *wl_read_prof(struct wl_priv *wl, s32 item)
 }
 
 static s32
-wl_update_prof(struct wl_priv *wl, const wl_event_msg_t *e, void *data,
-       s32 item)
+wl_update_prof(struct wl_priv *wl, struct net_device *ndev,
+       const wl_event_msg_t *e, void *data, s32 item)
 {
        s32 err = 0;
        struct wlc_ssid *ssid;
        unsigned long flags;
-
+       struct wl_profile *profile = wl_get_profile_by_netdev(wl, ndev);
+       if (!profile)
+               return WL_INVALID;
        flags = dhd_os_spin_lock((dhd_pub_t *)(wl->pub));
        switch (item) {
        case WL_PROF_SSID:
                ssid = (wlc_ssid_t *) data;
-               memset(wl->profile->ssid.SSID, 0,
-                       sizeof(wl->profile->ssid.SSID));
-               memcpy(wl->profile->ssid.SSID, ssid->SSID, ssid->SSID_len);
-               wl->profile->ssid.SSID_len = ssid->SSID_len;
+               memset(profile->ssid.SSID, 0,
+                       sizeof(profile->ssid.SSID));
+               memcpy(profile->ssid.SSID, ssid->SSID, ssid->SSID_len);
+               profile->ssid.SSID_len = ssid->SSID_len;
                break;
        case WL_PROF_BSSID:
                if (data)
-                       memcpy(wl->profile->bssid, data, ETHER_ADDR_LEN);
+                       memcpy(profile->bssid, data, ETHER_ADDR_LEN);
                else
-                       memset(wl->profile->bssid, 0, ETHER_ADDR_LEN);
+                       memset(profile->bssid, 0, ETHER_ADDR_LEN);
                break;
        case WL_PROF_SEC:
-               memcpy(&wl->profile->sec, data, sizeof(wl->profile->sec));
+               memcpy(&profile->sec, data, sizeof(profile->sec));
                break;
        case WL_PROF_ACT:
-               wl->profile->active = *(bool *)data;
+               profile->active = *(bool *)data;
                break;
        case WL_PROF_BEACONINT:
-               wl->profile->beacon_interval = *(u16 *)data;
+               profile->beacon_interval = *(u16 *)data;
                break;
        case WL_PROF_DTIMPERIOD:
-               wl->profile->dtim_period = *(u8 *)data;
+               profile->dtim_period = *(u8 *)data;
                break;
        default:
                WL_ERR(("unsupported item (%d)\n", item));
@@ -6514,7 +6697,7 @@ void wl_cfg80211_dbg_level(u32 level)
 
 static bool wl_is_ibssmode(struct wl_priv *wl, struct net_device *ndev)
 {
-       return get_mode_by_netdev(wl, ndev) == WL_MODE_IBSS;
+       return wl_get_mode_by_netdev(wl, ndev) == WL_MODE_IBSS;
 }
 
 static __used bool wl_is_ibssstarter(struct wl_priv *wl)
@@ -6663,7 +6846,7 @@ void *wl_cfg80211_request_fw(s8 *file_name)
 
        if (!test_bit(WL_FW_LOADING_DONE, &wl->fw->status)) {
                err = request_firmware(&wl->fw->fw_entry, file_name,
-                       &wl_cfg80211_get_sdio_func()->dev);
+                       wl_cfg80211_get_parent_dev());
                if (unlikely(err)) {
                        WL_ERR(("Could not download fw (%d)\n", err));
                        goto req_fw_out;
@@ -6676,7 +6859,7 @@ void *wl_cfg80211_request_fw(s8 *file_name)
                }
        } else if (!test_bit(WL_NVRAM_LOADING_DONE, &wl->fw->status)) {
                err = request_firmware(&wl->fw->fw_entry, file_name,
-                       &wl_cfg80211_get_sdio_func()->dev);
+                       wl_cfg80211_get_parent_dev());
                if (unlikely(err)) {
                        WL_ERR(("Could not download nvram (%d)\n", err));
                        goto req_fw_out;
@@ -6766,8 +6949,8 @@ s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len,
        if (wl->p2p && wl->p2p->vif_created) {
                ndev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION);
                bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_CONNECTION);
-       } else if (wl_get_drv_status(wl, AP_CREATING) ||
-               wl_get_drv_status(wl, AP_CREATED)) {
+       } else if (wl_get_drv_status(wl, AP_CREATING, net) ||
+               wl_get_drv_status(wl, AP_CREATED, net)) {
                ndev = net;
                bssidx = 0;
        }
@@ -6820,10 +7003,11 @@ static __used void wl_dongle_poweroff(struct wl_priv *wl)
        dhd_customer_gpio_wlan_ctrl(WLAN_RESET_OFF);
 }
 
-static int wl_debugfs_add_netdev_params(struct wl_priv *wl)
+static int wl_debugfs_add_netdev_params(struct wl_priv *wl, struct net_device *ndev)
 {
        char buf[10+IFNAMSIZ];
        struct dentry *fd;
+       struct wl_profile *profile = wl_get_profile_by_netdev(wl, ndev);
        s32 err = 0;
 
        WL_TRACE(("In\n"));
@@ -6831,14 +7015,14 @@ static int wl_debugfs_add_netdev_params(struct wl_priv *wl)
        wl->debugfsdir = debugfs_create_dir(buf, wl_to_wiphy(wl)->debugfsdir);
 
        fd = debugfs_create_u16("beacon_int", S_IRUGO, wl->debugfsdir,
-               (u16 *)&wl->profile->beacon_interval);
+               (u16 *)&profile->beacon_interval);
        if (!fd) {
                err = -ENOMEM;
                goto err_out;
        }
 
        fd = debugfs_create_u8("dtim_period", S_IRUGO, wl->debugfsdir,
-               (u8 *)&wl->profile->dtim_period);
+               (u8 *)&profile->dtim_period);
        if (!fd) {
                err = -ENOMEM;
                goto err_out;
@@ -6881,7 +7065,7 @@ static int wl_setup_rfkill(struct wl_priv *wl, bool setup)
                return -EINVAL;
        if (setup) {
                wl->rfkill = rfkill_alloc("brcmfmac-wifi",
-                       &wl_cfg80211_get_sdio_func()->dev,
+                       wl_cfg80211_get_parent_dev(),
                        RFKILL_TYPE_WLAN, &wl_rfkill_ops, (void *)wl);
 
                if (!wl->rfkill) {
@@ -7375,3 +7559,18 @@ int wl_cfg80211_set_btcoex_dhcp(struct net_device *dev, char *command)
 
        return (strlen("OK"));
 }
+
+struct device *wl_cfg80211_get_parent_dev(void)
+{
+       return cfg80211_parent_dev;
+}
+
+void wl_cfg80211_set_parent_dev(void *dev)
+{
+       cfg80211_parent_dev = dev;
+}
+
+static void wl_cfg80211_clear_parent_dev(void)
+{
+       cfg80211_parent_dev = NULL;
+}
index 232db1b..18ff276 100644 (file)
@@ -2,13 +2,13 @@
  * Linux cfg80211 driver
  *
  * Copyright (C) 1999-2011, Broadcom Corporation
- *
+ * 
  *         Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
  * under the terms of the GNU General Public License version 2 (the "GPL"),
  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
  * following added to such license:
- *
+ * 
  *      As a special exception, the copyright holders of this software give you
  * permission to link this software with independent modules, and to copy and
  * distribute the resulting executable under terms of your choice, provided that
@@ -16,7 +16,7 @@
  * the license of that module.  An independent module is a module which is not
  * derived from this software.  The special exception does not apply to any
  * modifications of the software.
- *
+ * 
  *      Notwithstanding the above, under no circumstances may you combine this
  * software in any way with any other Broadcom software provided under a license
  * other than the GPL, without Broadcom's express prior written consent.
@@ -130,10 +130,11 @@ do {                                                                      \
 #define WL_FILE_NAME_MAX       256
 #define WL_DWELL_TIME          200
 #define WL_LONG_DWELL_TIME     1000
-#define VWDEV_CNT 3
+#define IFACE_MAX_CNT 2
 
 #define WL_SCAN_TIMER_INTERVAL_MS      8000 /* Scan timeout */
 
+#define WL_INVALID -1
 /* dongle status */
 enum wl_status {
        WL_STATUS_READY = 0,
@@ -198,10 +199,6 @@ struct beacon_proberesp {
 
 /* dongle configuration */
 struct wl_conf {
-       struct net_mode {
-               struct net_device *ndev;
-               s32 type;
-       } mode [VWDEV_CNT + 1];         /* adhoc , infrastructure or ap */
        u32 frag_threshold;
        u32 rts_threshold;
        u32 retry_short;
@@ -262,16 +259,24 @@ struct wl_ibss {
 /* dongle profile */
 struct wl_profile {
        u32 mode;
+       s32 band;
        struct wlc_ssid ssid;
+       struct wl_security sec;
+       struct wl_ibss ibss;
        u8 bssid[ETHER_ADDR_LEN];
        u16 beacon_interval;
        u8 dtim_period;
-       struct wl_security sec;
-       struct wl_ibss ibss;
-       s32 band;
        bool active;
 };
 
+struct net_info {
+       struct net_device *ndev;
+       struct wireless_dev *wdev;
+       struct wl_profile profile;      /* holding dongle profile */
+       s32 mode;
+       unsigned long sme_state;
+       struct list_head list; /* list of all net_info structure */
+};
 typedef s32(*ISCAN_HANDLER) (struct wl_priv *wl);
 
 /* dongle iscan controller */
@@ -323,9 +328,10 @@ struct wl_pmk_list {
 #define ESCAN_BUF_SIZE (64 * 1024)
 
 struct escan_info {
-    u32 escan_state;
-    u8 escan_buf[ESCAN_BUF_SIZE];
-    struct wiphy *wiphy;
+       u32 escan_state;
+       u8 escan_buf[ESCAN_BUF_SIZE];
+       struct wiphy *wiphy;
+       struct net_device *ndev;
 };
 
 struct ap_info {
@@ -341,14 +347,14 @@ struct ap_info {
 };
 struct btcoex_info {
        struct timer_list timer;
-       uint32 timer_ms;
-       uint32 timer_on;
-       uint32 ts_dhcp_start;   /* ms ts ecord time stats */
-       uint32 ts_dhcp_ok;      /* ms ts ecord time stats */
-       bool dhcp_done;         /* flag, indicates that host done with
-                                * dhcp before t1/t2 expiration
-                                */
-       int bt_state;
+       u32 timer_ms;
+       u32 timer_on;
+       u32 ts_dhcp_start;      /* ms ts ecord time stats */
+       u32 ts_dhcp_ok;         /* ms ts ecord time stats */
+       bool dhcp_done; /* flag, indicates that host done with
+                                        * dhcp before t1/t2 expiration
+                                        */
+       s32 bt_state;
        struct work_struct work;
        struct net_device *dev;
 };
@@ -363,11 +369,15 @@ struct sta_info {
 /* dongle private data of cfg80211 interface */
 struct wl_priv {
        struct wireless_dev *wdev;      /* representing wl cfg80211 device */
-       struct wireless_dev *vwdev[VWDEV_CNT];
+
+       struct wireless_dev *p2p_wdev;  /* representing wl cfg80211 device for P2P */
+       struct net_device *p2p_net;    /* reference to p2p0 interface */
+
        struct wl_conf *conf;   /* dongle configuration */
        struct cfg80211_scan_request *scan_request;     /* scan request object */
        EVENT_HANDLER evt_handler[WLC_E_LAST];
        struct list_head eq_list;       /* used for event queue */
+       struct list_head net_list;     /* used for struct net_info */
        spinlock_t eq_lock;     /* for event queue synchronization */
        struct mutex usr_sync;  /* maily for dongle up/down synchronization */
        struct wl_scan_results *bss_list;
@@ -375,14 +385,8 @@ struct wl_priv {
 
        /* scan request object for internal purpose */
        struct wl_scan_req *scan_req_int;
-
-       /* bss information for cfg80211 layer */
-       struct wl_cfg80211_bss_info *bss_info;
        /* information element object for internal purpose */
        struct wl_ie ie;
-
-       /* for synchronization of main event thread */
-       struct wl_profile *profile;     /* holding dongle profile */
        struct wl_iscan_ctrl *iscan;    /* iscan controller */
 
        /* association information container */
@@ -392,8 +396,8 @@ struct wl_priv {
        struct wl_fw_ctrl *fw;
        struct wl_pmk_list *pmk_list;   /* wpa2 pmk list */
        tsk_ctl_t event_tsk;            /* task of main event handler thread */
-       unsigned long status;           /* current dongle status */
        void *pub;
+       u32 iface_cnt;
        u32 channel;            /* current channel */
        bool iscan_on;          /* iscan on/off switch */
        bool iscan_kickstart;   /* indicate iscan already started */
@@ -416,7 +420,7 @@ struct wl_priv {
        bool rf_blocked;
        struct ieee80211_channel remain_on_chan;
        enum nl80211_channel_type remain_on_chan_type;
-       u64 cache_cookie;
+       u64 last_roc_id;
        wait_queue_head_t dongle_event_wait;
        struct ap_info *ap_info;
        struct sta_info *sta_info;
@@ -426,98 +430,183 @@ struct wl_priv {
        struct timer_list scan_timeout;   /* Timer for catch scan event timeout */
 };
 
-#define wl_to_wiphy(w) (w->wdev->wiphy)
-#define wl_to_prmry_ndev(w) (w->wdev->netdev)
-#define ndev_to_wl(n) (wdev_to_wl(n->ieee80211_ptr))
-#define wl_to_sr(w) (w->scan_req_int)
-#define wl_to_ie(w) (&w->ie)
-#define iscan_to_wl(i) ((struct wl_priv *)(i->data))
-#define wl_to_iscan(w) (w->iscan)
-#define wl_to_conn(w) (&w->conn_info)
-#define wiphy_from_scan(w) (w->escan_info.wiphy)
-#define wl_get_drv_status(wl, stat)   (test_bit(WL_STATUS_ ## stat, &(wl)->status))
-#define wl_set_drv_status(wl, stat)   (set_bit(WL_STATUS_ ## stat, &(wl)->status))
-#define wl_clr_drv_status(wl, stat)   (clear_bit(WL_STATUS_ ## stat, &(wl)->status))
-#define wl_chg_drv_status(wl, stat)   (change_bit(WL_STATUS_ ## stat, &(wl)->status))
-
 static inline struct wl_bss_info *next_bss(struct wl_scan_results *list, struct wl_bss_info *bss)
 {
        return bss = bss ?
                (struct wl_bss_info *)((uintptr) bss + dtoh32(bss->length)) : list->bss_info;
 }
-static inline s32 alloc_idx_vwdev(struct wl_priv *wl)
+
+static inline s32
+wl_alloc_netinfo(struct wl_priv *wl, struct net_device *ndev,
+       struct wireless_dev * wdev, s32 mode)
 {
-       s32 i = 0;
-       for (i = 0; i < VWDEV_CNT; i++) {
-               if (wl->vwdev[i] == NULL)
-                               return i;
+       struct net_info *_net_info;
+       s32 err = 0;
+       if (wl->iface_cnt == IFACE_MAX_CNT)
+               return -ENOMEM;
+       _net_info = kzalloc(sizeof(struct net_info), GFP_KERNEL);
+       if (!_net_info)
+               err = -ENOMEM;
+       else {
+               _net_info->mode = mode;
+               _net_info->ndev = ndev;
+               _net_info->wdev = wdev;
+               wl->iface_cnt++;
+               list_add(&_net_info->list, &wl->net_list);
        }
-       WL_ERR((" *********alloc_idx_vwdev failed (%d) \n", -1));
-       return -1;
+       return err;
 }
 
-static inline s32 get_idx_vwdev_by_netdev(struct wl_priv *wl, struct net_device *ndev)
+static inline void
+wl_dealloc_netinfo(struct wl_priv *wl, struct net_device *ndev)
 {
-       s32 i = 0;
-       for (i = 0; i < VWDEV_CNT; i++) {
-               if ((wl->vwdev[i] != NULL) && (wl->vwdev[i]->netdev == ndev))
-                               return i;
+       struct net_info *_net_info, *next;
+
+       list_for_each_entry_safe(_net_info, next, &wl->net_list, list) {
+               if (ndev && (_net_info->ndev == ndev)) {
+                       list_del(&_net_info->list);
+                       wl->iface_cnt--;
+                       if (_net_info->wdev) {
+                               kfree(_net_info->wdev);
+                               ndev->ieee80211_ptr = NULL;
+                       }
+                       kfree(_net_info);
+               }
        }
-       WL_ERR((" *********get_idx_vwdev_by_netdev failed (%d) \n", -1));
-       return -1;
 }
+static inline void
+wl_delete_all_netinfo(struct wl_priv *wl)
+{
+       struct net_info *_net_info, *next;
+
+       list_for_each_entry_safe(_net_info, next, &wl->net_list, list) {
+               list_del(&_net_info->list);
+                       if (_net_info->wdev)
+                               kfree(_net_info->wdev);
+                       kfree(_net_info);
+       }
+       wl->iface_cnt = 0;
+}
+
+static inline bool
+wl_get_status_all(struct wl_priv *wl, s32 status)
 
-static inline s32 get_mode_by_netdev(struct wl_priv *wl, struct net_device *ndev)
 {
-       s32 i = 0;
-       for (i = 0; i <= VWDEV_CNT; i++) {
-               if (wl->conf->mode[i].ndev != NULL && (wl->conf->mode[i].ndev == ndev))
-                       return wl->conf->mode[i].type;
+       struct net_info *_net_info, *next;
+       u32 cnt = 0;
+       list_for_each_entry_safe(_net_info, next, &wl->net_list, list) {
+               if (_net_info->ndev &&
+                       test_bit(status, &_net_info->sme_state))
+                       cnt++;
        }
-       return -1;
+       return cnt? true: false;
 }
-static inline void set_mode_by_netdev(struct wl_priv *wl, struct net_device *ndev, s32 type)
+
+static inline void
+wl_set_status_by_netdev(struct wl_priv *wl, s32 status,
+       struct net_device *ndev, u32 op)
 {
-       s32 i = 0;
-       for (i = 0; i <= VWDEV_CNT; i++) {
-               if (type == -1) {
-                       /* free the info of netdev */
-                       if (wl->conf->mode[i].ndev == ndev) {
-                               wl->conf->mode[i].ndev = NULL;
-                               wl->conf->mode[i].type = -1;
-                               break;
-                       }
 
-               } else {
-                       if ((wl->conf->mode[i].ndev != NULL)&&
-                       (wl->conf->mode[i].ndev == ndev)) {
-