net: wireless: bcmdhd: Update to Version 5.90.195.15
authorDmitry Shmidt <dimitrysh@google.com>
Tue, 24 Jan 2012 21:37:34 +0000 (13:37 -0800)
committerDmitry Shmidt <dimitrysh@google.com>
Fri, 27 Jan 2012 23:32:32 +0000 (15:32 -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 24581ddd353cd2b75a39cedb551d6cbe598b92d2..6a25d9a5a57f2c7bb9008956ba54840f1aa717fc 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 0fa2329e2ae5269827fb7c32b30554ef1671585f..e19c2fd5028c3fb6962c4c5c9c004600f1332c5f 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>
 #if !defined(SDIO_DEVICE_ID_BROADCOM_4319)
 #define SDIO_DEVICE_ID_BROADCOM_4319   0x4319
 #endif /* !defined(SDIO_DEVICE_ID_BROADCOM_4319) */
+#if !defined(SDIO_DEVICE_ID_BROADCOM_4330)
+#define SDIO_DEVICE_ID_BROADCOM_4330   0x4330
+#endif /* !defined(SDIO_DEVICE_ID_BROADCOM_4330) */
 
 #include <bcmsdh_sdmmc.h>
 
 #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 +121,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...\n"));
                ret = bcmsdh_probe(&func->dev);
@@ -153,7 +156,10 @@ 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_4329) },
        { 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 fbdd7cd2d19bc52a68b8b5bad5a4e7cd56c2e5ef..6b578e65364838b1c0d239416e48da6638765c59 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 84d1761a90698b0ab553e91def2799831687eb98..4335d0d6a8ac58c7a41b7b82ede812d7bdd66b99 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,
@@ -365,6 +368,11 @@ void dhd_osl_detach(osl_t *osh);
  * bus_hdrlen specifies required headroom for bus module header.
  */
 extern dhd_pub_t *dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen);
+#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 int dhd_net_attach(dhd_pub_t *dhdp, int idx);
 
 /* Indication from bus module regarding removal/absence of dongle */
@@ -411,6 +419,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 +431,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 +442,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 +714,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 8460992060301b0fe604b1c111a2b0035b7d0a8b..50e275a4ae231121434bfd17f7cec3fb7d2d077f 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 9df70a00dbf5c84d4c0a02844ce7eb29eebfcb48..6376546c62c023bf4d412ddb9579ccfc85a9b774 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>
@@ -857,6 +857,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 f25fc324f2499624e0dec294b3950a8f85cfbe54..48c970a6b5b35a9fee1d0848f1670d76f1c7b110 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>
@@ -109,6 +109,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);
@@ -273,6 +274,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
@@ -941,8 +946,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));
@@ -1032,10 +1038,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
@@ -1166,6 +1170,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;
 }
@@ -1199,7 +1204,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;
 
@@ -1207,6 +1212,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 */
@@ -1593,8 +1601,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);
@@ -2043,6 +2053,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;
        }
@@ -2240,6 +2251,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) &&
@@ -2249,6 +2261,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))
@@ -2364,7 +2377,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) {
@@ -2490,6 +2502,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)
 {
@@ -2682,6 +2714,7 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen)
 #endif
 
 #ifdef ARP_OFFLOAD_SUPPORT
+       dhd->pend_ipaddr = 0;
        register_inetaddr_notifier(&dhd_notifier);
 #endif /* ARP_OFFLOAD_SUPPORT */
 
@@ -2715,7 +2748,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 */
@@ -2728,14 +2762,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;
        }
@@ -2749,7 +2785,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;
        }
@@ -2765,7 +2802,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;
        }
@@ -2782,13 +2820,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
@@ -2803,6 +2843,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;
 }
 
@@ -2822,9 +2871,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 */
@@ -3022,6 +3071,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_TXFAIL);
        setbit(eventmask, WLC_E_JOIN_START);
@@ -3142,26 +3193,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;
@@ -3265,9 +3296,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;
                        }
 
@@ -3285,7 +3320,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",
@@ -3359,7 +3394,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;
@@ -3496,13 +3532,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);
@@ -4538,15 +4576,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);
@@ -4557,6 +4586,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;
@@ -4596,8 +4634,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 ce94ff9993db1096cec3807dae617faf8d3da9d2..d4dca260721268ff1d66933a32ab75ed7d7a5b88 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 1bdc7d50f1fb4f4d7f0d03862bdc3ccc4cee719b..7866eb771d586afffd067178458d167da26b68f4 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 59d018b64c6fe91645cd83feedb6824c4ffc06be..c4d251806d78088c5d09ad23396cb0827b31c458 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 b9586e40d0c226a0146625c2f7f9c07b6ed20cfd..111b5be9cbf9aa7321fc9eeaa7af1eca85cc79aa 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 c07266fd6fdc790ed53ea458bc23b34ae6a01a97..67c4906f58897c9cf270d2de643cd54c949bbfe1 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 375df443a29a3b6bb81bba1a5cbd7d9fe347159a..b993a033abc2070f03f0edd80565b79103ac008d 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 ce45c50d9641fac4575d304d24221ae928065233..77a20f87b7eafe0ea6c2bb9847bc6a23f1131d0e 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 da1fd5e4eac480835a90b5e045abf380a03b6f69..17cc0e955f62ad7893fa07675bbcc19d2f781457 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 4f707c0c6920a85faee042ac05e469bc4319a248..f0542f2ac11b6ee83bd79b51a3c8e42c57158345 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 04b07ecb8043f52543d8858044f5459e12c80c4b..f3356a724b44e6b0df88ca4af064d40c2aea7916 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 fd148c591d88459b9b4ad7966bc0c6f0da66c759..51e0427e7f6056cec5ce582000ba1ad4003410b2 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 a3985cf29375e0912f88675ff5e4a79e77f11a48..a503edbd62261bcccd9636ceefd682bff4e8c073 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 5fda5e9b5df462854847412472084c5ca7392330..21a58b473e913fe3d66ffe2c94fc0b2dcaaae170 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 6131d8ae4305517e0244641f533b14ddf037789a..def3c0269279b11e636e3f1f0472429166352841 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 d188c4ec7d5a51e740040f277d9b3d53841dd1f4..bea97b610a8e17b75f1114cce913a531dc2258ef 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 ee29b5c08a5cd8afa2a44018c8491ea93aaef205..1b9d39fee8fc7bd94f76c831e3187c6e99691e0c 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 0bff355f8ffd00060e612cec76aa6754489b95f2..a62bee42b2ba8b89349c6a597ae4e2f23f3c9b2c 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 0f4c0267dbc839d9253c61da8dbd0280ec4e354f..c14444c57d369fcab40cc980502debec8c0dd704 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 0eb2a30c9a84d6057ee94e289519600b762c0885..34a02d00c6bd017c168ec473922c32342e987f5a 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 530036f0ba7720d8e17a177453ae08b8f857d8ed..6849c26da837260ce50d625e2c84acb9ace07624 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 45f3c0312dcc23a4c8c7389234901659d837c6ab..e5207e9c40861607baa64c8509c737e5cf65ed00 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 9661dac2603f35f9e2596fb8a4fac6e68fd64394..3f3755b53b09e3db6b16227cda131f2c31405b64 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 fe71e166a7d933ccdd12c45292e089cbd35f30ea..41a078c42a033ea440dd253da98738b80646672f 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 51c51b9734a2f907552f0ac6abb9b4814825df1d..69a834c6b7eb7d2a42059a3e37e9173dda4af601 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 8b9615c35f35c5e3629d2b929c22e23479ca4f99..7d862c4deb21fe2f921ae52f762901a411401126 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 b9ede53af7016b8f2071742bf3b631ccb8bf6eb7..859ddc8953a8701c0f038740055e76e2eef99416 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 4e26121c3881cc88fd6f04f796c436681f1cf920..34f927c6af806acd3e292130f57296f7acff8c5a 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 379fbbe37dbce95220e82a01ec488592cd1becbd..d875edb816c9c24e0997618b8a8f886b123566a1 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 38de2982f137bc29a6e48f716060d7191898cad9..830d351d882b446931e73a24c5b66b59e2e96f46 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 96844db2f059caf94d0e945316cb29b81b4a304f..e5189821b4cba8cca9bc8e5c1a09b175b93278aa 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 f468420f5346ecc50719cdec7723a3aacbb4d559..77eace6252d7008ba6af1afa226c7c3878ee189b 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 721d42100f2a1cc7e77a15ffae4b95d7b625df62..088f1e845a4324a29b08b7d9284e886c3f57d3b9 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 80248ee7604e42b89fd9f38ebc017e3460eb3fbf..b8cc2569f50655799052f8f5b0b3f0737621a514 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 5d4a87678071b6f0ca6e03f949a866c3bc145031..71f8b2e13b3bf60e9027a9bee47182c44eee04db 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 da2fed68afac38c4b50016c6f4b5d6c92527bbf7..afc2ba32fd937143ab27758c8d64b74690aac5a4 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 fae063a72f1846835728064d4ee72ce9e7122945..66199431fb92fc1855e3840ee7e138d4d74be131 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 2342cb3831471bbe4504b24b8441544ae15e9776..8850b2ded2360aad8de11e47fd344ed61ea9b2e8 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 4ccfab02056b758bc12b64df8bcc79bd3eea4ca6..cbdd05e624bccd7790b425aec8ce88b5c1753e42 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 ce8ad083f286a1835633070f91bb66b504769935..0e070a475b64cf00d00df77f4b431d11c9d1de75 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 cf206250246f7a16cb63552093ec0c779a303459..c7e07bd5e7c3f1e9784b80692dd9c67329d25ae4 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 46fa4c9f89e8419966b4b0a128973d94224ce945..0f75d3c8f1d603edd5f1cdc4b8e012c89677ae1c 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 30ec848c40ae1678cae6b02a1678293dbf3d550a..e8c2387dd10bbbffe73d8c94a37bf67ac6a02bff 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 8a8f3146d56b554b74919b64bbc33ce1c71863da..55eff247c492e87f81dedea6425c2def17bfc114 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 89c1181791598f6007bfd13e24d1e88aba51d244..91ab4fe538f21d267032f2ff2fd0330b458b878b 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 5781d1312e3595a81c3fb5c5cfc8fdecc980d6d1..92634c1221a64c04ec6ff4b61644e8ef03d62190 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 6a6dd14c1bbba0e1722a79b3e07dffa70b5ecd9d..20865dc5a231801be508ebc1d47d400ff6aecb42 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 4a0c9d1ddc37815dc6e96993e7fec55770209b43..d2bf3f20688c533b2a31a55db2b413994c4b91e1 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 7fe4fbce310e68c6bc6ca12dda620a258b084503..7353ff0d7c73b61f4347ef8c136aa3d126871cc7 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 07fa7e499c236df4ef75b42f71959636fc9deb34..27f005537604a2dc57752885095e310bb2cfeadc 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 1ff06dc79423c49ae48d422379668551bae35848..7361cbf20b0652ecc1e0172b2aaf6dfab7100836 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 cbd37490f1cb1b68b498da3d7c9e9c6d1cd02004..3fe2a5a49d30598ff7e928021ce9e58b8ef23aac 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 76f05ae34bd5834a0439da925ed3a6f1f01b91c2..f45351a586cb1e74aa1dbd52304c74e75007de68 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 05d0587bc205fdb1e630e27f0dbec4514dc37bdc..77c413f75f0d4ecb7d58626d0ef594492ca25543 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 aba914bd014f6a77cfda0864a8ada763d6f70479..d84f69ab5617a2d7ffd9a799057b2c6514801e3a 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 4280d5bf9c1f4b9fb675626c1d5332d55e126f5a..7aaeb73f01003e4c2b0187f6c6704ba590cc2e54 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 107a8b07c9e6fe8d65a37075c2692eac09fd7ca1..e5176483e9a1d70a861d08c8a473e5bb3390430a 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 1cba42238905ab1f30a6e696f45671355e680b4a..45c4dc208bda33aa8678845b0ac933895eac95fc 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 ca932266a1b2ff4158b2406f8bd7695fb39adc12..c8ac7b773fb9a1a7b9c8cc26b555efa85b20cc84 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 3d37c7a7e30bd73e37c58a7825209746d714f387..5f47d6f88ceae68fa96db6e6c7c1fb40ec9699c2 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 2c5bcf97e910f58c5cc6d46651f3b960bf97e960..55a3d3490c306a4718b480d661db8683f5ae7daf 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 c5a33832b585c8752ef8659a95f396da32269491..6a7b93c7b977f7cebe9bf6e044e26c40a27d8048 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 397006ab005a90fc6b95cfbd1c4a47159385b17b..b52fb15ba5c089d6f9c70deb4bf90d9bcc8ff3db 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 228b5dcf11c7bf3d816749ed49617dfc22672661..d0902fe808915f5898b894fa701a333d2573b65e 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 7230d3b67ab0a14c854257fa82ce48f13b803533..d37105165bab22fc45efb097ec72491157f5e892 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 9357552c919492a716cff388c1382a7f28a8912f..676068c0b387532c4e13a543197a8c1a972a2fe6 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 b3fcdd2f1adebf97f38867a4c78a5dcbb7dcc82b..4ef7bf7b24dc71b8b98bbc2f2c3fec8dd35c9d3c 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 22aa412657639b1536ef1536222bd38f5597d622..4b71563035538ceebeb021563585a4cb271ca753 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 b6804817240ad11121602d9c6123cb66702a55bf..dc32f17a91facd549cae3f1df9461931ad3bd0d5 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 e026a7db28a986771d35357ab4332936568de388..93fa447c16ba120632d292404814e3c2b20a6b82 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;
 
@@ -4139,24 +4232,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)
@@ -4336,8 +4420,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);
@@ -4398,21 +4484,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));
                                }
                        }
 
@@ -4420,15 +4505,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
                                */
@@ -4440,12 +4525,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",
@@ -4454,11 +4539,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__);
@@ -4480,13 +4565,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;
 }
@@ -4646,14 +4731,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,
@@ -4699,8 +4784,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);
@@ -4716,8 +4801,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,
@@ -4729,7 +4814,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;
 }
@@ -4740,20 +4825,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,
@@ -4815,11 +4900,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)) {
@@ -4912,6 +5001,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;
@@ -4922,6 +5012,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
@@ -4933,10 +5033,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,
@@ -4953,7 +5053,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);
@@ -4972,12 +5072,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;
@@ -4985,12 +5080,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);
 }
 
@@ -5030,16 +5125,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)) {
@@ -5093,12 +5178,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);
@@ -5159,16 +5240,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;
@@ -5323,7 +5405,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);
        }
@@ -5369,13 +5451,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));
@@ -5400,8 +5508,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;
        }
@@ -5473,7 +5584,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);
                }
        }
@@ -5485,7 +5596,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);
                }
        }
@@ -5497,7 +5608,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);
                }
        }
@@ -5546,9 +5657,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;
@@ -5559,24 +5669,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;
@@ -5591,25 +5698,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)
 {
@@ -5621,7 +5748,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 |=
@@ -5629,67 +5756,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:
@@ -5710,16 +5860,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);
 }
 
@@ -5731,6 +5880,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;
@@ -5747,9 +5932,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 {
@@ -5860,21 +6056,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;
@@ -5912,7 +6093,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;
 }
@@ -6276,14 +6457,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;
 
 }
@@ -6315,16 +6493,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;
 }
 
@@ -6332,13 +6510,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));
@@ -6346,15 +6525,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;
@@ -6428,24 +6607,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);
@@ -6455,39 +6636,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));
@@ -6511,7 +6694,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)
@@ -6660,7 +6843,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;
@@ -6673,7 +6856,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;
@@ -6763,8 +6946,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;
        }
@@ -6817,10 +7000,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"));
@@ -6828,14 +7012,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;
@@ -6878,7 +7062,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) {
@@ -7372,3 +7556,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 232db1b1f830b29b4044ce1b301c30b7e8bd9a0d..18ff27680cb0f84d4639d6b3246c5108241b0ac6 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)) {
-                               /* update type of ndev */
-                               wl->conf->mode[i].type = type;
-                               break;
-                       }
-                       else if ((wl->conf->mode[i].ndev == NULL)&&
-                       (wl->conf->mode[i].type == -1)) {
-                               wl->conf->mode[i].ndev = ndev;
-                               wl->conf->mode[i].type = type;
-                               break;
+       struct net_info *_net_info, *next;
+
+       list_for_each_entry_safe(_net_info, next, &wl->net_list, list) {
+               if (ndev && (_net_info->ndev == ndev)) {
+                       switch (op) {
+                               case 1:
+                                       set_bit(status, &_net_info->sme_state);
+                                       break;
+                               case 2:
+                                       clear_bit(status, &_net_info->sme_state);
+                                       break;
+                               case 4:
+                                       change_bit(status, &_net_info->sme_state);
+                                       break;
                        }
                }
+
+       }
+}
+
+static inline u32
+wl_get_status_by_netdev(struct wl_priv *wl, s32 status,
+       struct net_device *ndev)
+{
+       struct net_info *_net_info, *next;
+
+       list_for_each_entry_safe(_net_info, next, &wl->net_list, list) {
+                               if (ndev && (_net_info->ndev == ndev))
+                                       return test_bit(status, &_net_info->sme_state);
        }
+       return 0;
 }
-#define free_vwdev_by_index(wl, __i) do {      \
-                                               if (wl->vwdev[__i] != NULL) \
-                                                       kfree(wl->vwdev[__i]); \
-                                               wl->vwdev[__i] = NULL; \
-                                       } while (0)
+
+static inline s32
+wl_get_mode_by_netdev(struct wl_priv *wl, struct net_device *ndev)
+{
+       struct net_info *_net_info, *next;
+
+       list_for_each_entry_safe(_net_info, next, &wl->net_list, list) {
+                               if (ndev && (_net_info->ndev == ndev))
+                                       return _net_info->mode;
+       }
+       return -1;
+}
+
+static inline void
+wl_set_mode_by_netdev(struct wl_priv *wl, struct net_device *ndev,
+       s32 mode)
+{
+       struct net_info *_net_info, *next;
+
+       list_for_each_entry_safe(_net_info, next, &wl->net_list, list) {
+                               if (ndev && (_net_info->ndev == ndev))
+                                       _net_info->mode = mode;
+       }
+}
+
+static inline struct wl_profile *
+wl_get_profile_by_netdev(struct wl_priv *wl, struct net_device *ndev)
+{
+       struct net_info *_net_info, *next;
+
+       list_for_each_entry_safe(_net_info, next, &wl->net_list, list) {
+                               if (ndev && (_net_info->ndev == ndev))
+                                       return &_net_info->profile;
+       }
+       return NULL;
+}
+#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_all(wl, stat) \
+       (wl_get_status_all(wl, WL_STATUS_ ## stat))
+#define wl_get_drv_status(wl, stat, ndev)  \
+       (wl_get_status_by_netdev(wl, WL_STATUS_ ## stat, ndev))
+#define wl_set_drv_status(wl, stat, ndev)  \
+       (wl_set_status_by_netdev(wl, WL_STATUS_ ## stat, ndev, 1))
+#define wl_clr_drv_status(wl, stat, ndev)  \
+       (wl_set_status_by_netdev(wl, WL_STATUS_ ## stat, ndev, 2))
+#define wl_chg_drv_status(wl, stat, ndev)  \
+       (wl_set_status_by_netdev(wl, WL_STATUS_ ## stat, ndev, 4))
 
 #define for_each_bss(list, bss, __i)   \
        for (__i = 0; __i < list->count && __i < WL_AP_MAX; __i++, bss = next_bss(list, bss))
 
+#define for_each_ndev(wl, iter, next) \
+       list_for_each_entry_safe(iter, next, &wl->net_list, list)
+
+
 /* In case of WPS from wpa_supplicant, pairwise siute and group suite is 0.
  * In addtion to that, wpa_version is WPA_VERSION_1
  */
 #define is_wps_conn(_sme) \
-       ((_sme->crypto.wpa_versions & NL80211_WPA_VERSION_1) && \
+       ((wl_cfgp2p_find_wpsie((u8 *)_sme->ie, _sme->ie_len) != NULL) && \
         (!_sme->crypto.n_ciphers_pairwise) && \
         (!_sme->crypto.cipher_group))
 extern s32 wl_cfg80211_attach(struct net_device *ndev, void *data);
@@ -526,14 +615,14 @@ extern void wl_cfg80211_detach(void);
 /* event handler from dongle */
 extern void wl_cfg80211_event(struct net_device *ndev, const wl_event_msg_t *e,
             void *data);
-extern void wl_cfg80211_set_sdio_func(void *func);     /* set sdio function info */
-extern struct sdio_func *wl_cfg80211_get_sdio_func(void);      /* set sdio function info */
+void wl_cfg80211_set_parent_dev(void *dev);
+struct device *wl_cfg80211_get_parent_dev(void);
+
 extern s32 wl_cfg80211_up(void);       /* dongle up */
 extern s32 wl_cfg80211_down(void);     /* dongle down */
 extern s32 wl_cfg80211_notify_ifadd(struct net_device *net, s32 idx, s32 bssidx,
 int (*_net_attach)(dhd_pub_t *dhdp, int ifidx));
 extern s32 wl_cfg80211_notify_ifdel(struct net_device *ndev);
-extern s32 wl_cfg80211_post_del(void *ndev);
 extern s32 wl_cfg80211_is_progress_ifadd(void);
 extern s32 wl_cfg80211_is_progress_ifchange(void);
 extern s32 wl_cfg80211_is_progress_ifadd(void);
@@ -551,6 +640,7 @@ extern s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len
        enum wl_management_type type);
 extern s32 wl_cfg80211_set_p2p_ps(struct net_device *net, char* buf, int len);
 extern int wl_cfg80211_hang(struct net_device *dev, u16 reason);
+extern s32 wl_mode_to_nl80211_iftype(s32 mode);
 
 /* do scan abort */
 extern s32
index 4ee6557e17dd838205abdf11b75ddde27d2e37d4..85c36101ab41f5ad54515fba7a2f3cb7a3ed8ce8 100644 (file)
@@ -47,7 +47,7 @@
 #include <wl_cfg80211.h>
 #include <wl_cfgp2p.h>
 #include <wldev_common.h>
-
+#include <wl_android.h>
 
 static s8 ioctlbuf[WLC_IOCTL_MAXLEN];
 static s8 scanparambuf[WLC_IOCTL_SMLEN];
@@ -59,6 +59,19 @@ wl_cfgp2p_has_ie(u8 *ie, u8 **tlvs, u32 *tlvs_len, const u8 *oui, u32 oui_len, u
 static s32
 wl_cfgp2p_vndr_ie(struct net_device *ndev, s32 bssidx, s32 pktflag,
             s8 *oui, s32 ie_id, s8 *data, s32 data_len, s32 delete);
+
+static int wl_cfgp2p_start_xmit(struct sk_buff *skb, struct net_device *ndev);
+static int wl_cfgp2p_do_ioctl(struct net_device *net, struct ifreq *ifr, int cmd);
+static int wl_cfgp2p_if_open(struct net_device *net);
+static int wl_cfgp2p_if_stop(struct net_device *net);
+
+static const struct net_device_ops wl_cfgp2p_if_ops = {
+       .ndo_open               = wl_cfgp2p_if_open,
+       .ndo_stop               = wl_cfgp2p_if_stop,
+       .ndo_do_ioctl           = wl_cfgp2p_do_ioctl,
+       .ndo_start_xmit         = wl_cfgp2p_start_xmit,
+};
+
 /*
  *  Initialize variables related to P2P
  *
@@ -569,7 +582,7 @@ wl_cfgp2p_escan(struct wl_priv *wl, struct net_device *dev, u16 active,
 
        eparams->params.nprobes = htod32(P2PAPI_SCAN_NPROBES);
        eparams->params.home_time = htod32(P2PAPI_SCAN_HOME_TIME_MS);
-       if (wl_get_drv_status(wl, CONNECTED))
+       if (wl_get_drv_status_all(wl, CONNECTED))
                eparams->params.active_time = htod32(-1);
        else if (num_chans == 3)
                eparams->params.active_time = htod32(P2PAPI_SCAN_SOCIAL_DWELL_TIME_MS);
@@ -670,7 +683,7 @@ wl_cfgp2p_set_management_ie(struct wl_priv *wl, struct net_device *ndev, s32 bss
                                CFGP2P_ERR(("not suitable type\n"));
                                return -1;
                }
-       } else if (get_mode_by_netdev(wl, ndev) == WL_MODE_AP) {
+       } else if (wl_get_mode_by_netdev(wl, ndev) == WL_MODE_AP) {
                switch (pktflag) {
                        case VNDR_IE_PRBRSP_FLAG :
                                mgmt_ie_buf = wl->ap_info->probe_res_ie;
@@ -689,7 +702,7 @@ wl_cfgp2p_set_management_ie(struct wl_priv *wl, struct net_device *ndev, s32 bss
                                return -1;
                }
                bssidx = 0;
-       } else if (bssidx == -1 && get_mode_by_netdev(wl, ndev) == WL_MODE_BSS) {
+       } else if (bssidx == -1 && wl_get_mode_by_netdev(wl, ndev) == WL_MODE_BSS) {
                switch (pktflag) {
                        case VNDR_IE_PRBREQ_FLAG :
                                mgmt_ie_buf = wl->sta_info->probe_req_ie;
@@ -964,7 +977,7 @@ wl_cfgp2p_listen_complete(struct wl_priv *wl, struct net_device *ndev,
                        del_timer_sync(&wl->p2p->listen_timer);
                        spin_unlock_bh(&wl->p2p->timer_lock);
                }
-               cfg80211_remain_on_channel_expired(ndev, wl->cache_cookie, &wl->remain_on_chan,
+               cfg80211_remain_on_channel_expired(ndev, wl->last_roc_id, &wl->remain_on_chan,
                    wl->remain_on_chan_type, GFP_KERNEL);
        } else
                wl_clr_p2p_status(wl, LISTEN_EXPIRED);
@@ -1467,3 +1480,145 @@ s32 wl_cfgp2p_set_p2p_ps(struct wl_priv *wl, struct net_device *ndev, char* buf,
        }
        return ret;
 }
+
+s32
+wl_cfgp2p_register_ndev(struct wl_priv *wl)
+{
+       int ret = 0;
+       struct net_device* net = NULL;
+       struct wireless_dev *wdev;
+       uint8 temp_addr[ETHER_ADDR_LEN] = { 0x00, 0x90, 0x4c, 0x33, 0x22, 0x11 };
+
+       /* Allocate etherdev, including space for private structure */
+       if (!(net = alloc_etherdev(sizeof(wl)))) {
+               CFGP2P_ERR(("%s: OOM - alloc_etherdev\n", __FUNCTION__));
+               goto fail;
+       }
+
+       strcpy(net->name, "p2p%d");
+       net->name[IFNAMSIZ - 1] = '\0';
+
+       /* Copy the reference to wl_priv */
+       memcpy((void *)netdev_priv(net), &wl, sizeof(wl));
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31))
+       ASSERT(!net->open);
+       net->do_ioctl = wl_cfgp2p_do_ioctl;
+       net->hard_start_xmit = wl_cfgp2p_start_xmit;
+       net->open = wl_cfgp2p_if_open;
+       net->stop = wl_cfgp2p_if_stop;
+#else
+       ASSERT(!net->netdev_ops);
+       net->netdev_ops = &wl_cfgp2p_if_ops;
+#endif
+
+       /* Register with a dummy MAC addr */
+       memcpy(net->dev_addr, temp_addr, ETHER_ADDR_LEN);
+
+       wdev = kzalloc(sizeof(*wdev), GFP_KERNEL);
+       if (unlikely(!wdev)) {
+               WL_ERR(("Could not allocate wireless device\n"));
+               return -ENOMEM;
+       }
+
+       wdev->wiphy = wl->wdev->wiphy;
+
+       wdev->iftype = wl_mode_to_nl80211_iftype(WL_MODE_BSS);
+
+       net->ieee80211_ptr = wdev;
+
+       SET_NETDEV_DEV(net, wiphy_dev(wdev->wiphy));
+
+       /* Associate p2p0 network interface with new wdev */
+       wdev->netdev = net;
+
+       /* store p2p net ptr for further reference. Note that iflist won't have this
+        * entry as there corresponding firmware interface is a "Hidden" interface.
+        */
+       if (wl->p2p_net) {
+               CFGP2P_ERR(("p2p_net defined already.\n"));
+               return -EINVAL;
+       } else {
+               wl->p2p_wdev = wdev;
+               wl->p2p_net = net;
+       }
+
+       ret = register_netdev(net);
+       if (ret) {
+               CFGP2P_ERR((" register_netdevice failed (%d)\n", ret));
+               goto fail;
+       }
+
+       printk("%s: P2P Interface Registered\n", net->name);
+
+       return ret;
+fail:
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31)
+       net->open = NULL;
+#else
+       net->netdev_ops = NULL;
+#endif
+
+       if (net) {
+               unregister_netdev(net);
+               free_netdev(net);
+       }
+
+       return -ENODEV;
+}
+
+s32
+wl_cfgp2p_unregister_ndev(struct wl_priv *wl)
+{
+
+       if (!wl || !wl->p2p_net) {
+               CFGP2P_ERR(("Invalid Ptr\n"));
+               return -EINVAL;
+       }
+
+       unregister_netdev(wl->p2p_net);
+       free_netdev(wl->p2p_net);
+
+       return 0;
+}
+
+static int wl_cfgp2p_start_xmit(struct sk_buff *skb, struct net_device *ndev)
+{
+       CFGP2P_DBG(("(%s) is not used for data operations. Droping the packet. \n", ndev->name));
+       return 0;
+}
+
+static int wl_cfgp2p_do_ioctl(struct net_device *net, struct ifreq *ifr, int cmd)
+{
+       int ret = 0;
+       struct wl_priv *wl = *(struct wl_priv **)netdev_priv(net);
+       struct net_device *ndev = wl_to_prmry_ndev(wl);
+
+       /* There is no ifidx corresponding to p2p0 in our firmware. So we should
+        * not Handle any IOCTL cmds on p2p0 other than ANDROID PRIVATE CMDs.
+        * For Android PRIV CMD handling map it to primary I/F
+        */
+       if (cmd == SIOCDEVPRIVATE+1) {
+               ret = wl_android_priv_cmd(ndev, ifr, cmd);
+
+       } else {
+               CFGP2P_ERR(("%s: IOCTL req 0x%x on p2p0 I/F. Ignoring. \n",
+               __FUNCTION__, cmd));
+               return -1;
+       }
+
+       return ret;
+}
+
+static int wl_cfgp2p_if_open(struct net_device *net)
+{
+       CFGP2P_DBG(("Do Nothing \n"));
+       return 0;
+}
+
+static int wl_cfgp2p_if_stop(struct net_device *net)
+{
+       CFGP2P_DBG(("Do Nothing \n"));
+       return 0;
+}
index 5a69168c6a3adc705b473b1695fc0917d8d25dff..6934d8f1c9bea55898c8048cf312c2d94649597d 100644 (file)
@@ -103,11 +103,11 @@ enum wl_cfgp2p_status {
 #define wl_to_p2p_bss(wl, type) ((wl)->p2p->bss_idx[type])
 #define wl_get_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? 0 : test_bit(WLP2P_STATUS_ ## stat, \
                                                                        &(wl)->p2p->status))
-#define wl_set_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? : set_bit(WLP2P_STATUS_ ## stat, \
+#define wl_set_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? : set_bit(WLP2P_STATUS_ ## stat, \
                                                                        &(wl)->p2p->status))
-#define wl_clr_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? : clear_bit(WLP2P_STATUS_ ## stat, \
+#define wl_clr_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? : clear_bit(WLP2P_STATUS_ ## stat, \
                                                                        &(wl)->p2p->status))
-#define wl_chg_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? : change_bit(WLP2P_STATUS_ ## stat, \
+#define wl_chg_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? : change_bit(WLP2P_STATUS_ ## stat, \
                                                                        &(wl)->p2p->status))
 #define p2p_on(wl) ((wl)->p2p->on)
 #define p2p_scan(wl) ((wl)->p2p->scan)
@@ -235,6 +235,12 @@ wl_cfgp2p_get_p2p_noa(struct wl_priv *wl, struct net_device *ndev, char* buf, in
 extern s32
 wl_cfgp2p_set_p2p_ps(struct wl_priv *wl, struct net_device *ndev, char* buf, int len);
 
+extern s32
+wl_cfgp2p_register_ndev(struct wl_priv *wl);
+
+extern s32
+wl_cfgp2p_unregister_ndev(struct wl_priv *wl);
+
 /* WiFi Direct */
 #define SOCIAL_CHAN_1 1
 #define SOCIAL_CHAN_2 6
index 32f7b57d2d4984f7fa62c42c9314f779863e0027..d09448a7932fe0dbe974c89f5374dc4804956007 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: wl_iw.c,v 1.132.2.18 2011-02-05 01:44:47 Exp $
+ * $Id: wl_iw.c,v 1.132.2.18 2011-02-05 01:44:47 $
  */
 
 #include <wlioctl.h>
@@ -1564,6 +1564,63 @@ exit_proc:
        net_os_wake_unlock(dev);
        return res;
 }
+
+static int
+wl_iw_set_pno_setadd(
+       struct net_device *dev,
+       struct iw_request_info *info,
+       union iwreq_data *wrqu,
+       char *extra
+)
+{
+       int ret = -1;
+       char *tmp_ptr;
+       int size, tmp_size;
+
+       net_os_wake_lock(dev);
+       WL_ERROR(("\n### %s: info->cmd:%x, info->flags:%x, u.data=0x%p, u.len=%d\n",
+               __FUNCTION__, info->cmd, info->flags,
+               wrqu->data.pointer, wrqu->data.length));
+
+       if (g_onoff == G_WLAN_SET_OFF) {
+               WL_TRACE(("%s: driver is not up yet after START\n", __FUNCTION__));
+               goto exit_proc;
+       }
+
+       if (wrqu->data.length <= strlen(PNOSETADD_SET_CMD) + sizeof(cmd_tlv_t)) {
+               WL_ERROR(("%s argument=%d less than %d\n", __FUNCTION__,
+                         wrqu->data.length, (int)(strlen(PNOSETADD_SET_CMD) + sizeof(cmd_tlv_t))));
+               goto exit_proc;
+       }
+
+       
+       bcopy(PNOSETUP_SET_CMD, extra, strlen(PNOSETUP_SET_CMD));
+
+       tmp_ptr = extra + strlen(PNOSETUP_SET_CMD);
+       size = wrqu->data.length - strlen(PNOSETUP_SET_CMD);
+       tmp_size = size;
+       
+       while (*tmp_ptr && tmp_size > 0) {
+               if ((*tmp_ptr == 'S') && (size - tmp_size) >= sizeof(cmd_tlv_t)) {
+                       *(tmp_ptr + 1) = ((*(tmp_ptr + 1) - '0') << 4) + (*(tmp_ptr + 2) - '0');
+                       memmove(tmp_ptr + 2, tmp_ptr + 3, tmp_size - 3);
+                       tmp_size -= 2 + *(tmp_ptr + 1);
+                       tmp_ptr += 2 + *(tmp_ptr + 1);
+                       size--;
+               } else {
+                       tmp_ptr++;
+                       tmp_size--;
+               }
+       }
+
+       wrqu->data.length = strlen(PNOSETUP_SET_CMD) + size;
+       ret = wl_iw_set_pno_set(dev, info, wrqu, extra);
+
+exit_proc:
+       net_os_wake_unlock(dev);
+       return ret;
+
+}
 #endif 
 
 static int
@@ -2567,6 +2624,8 @@ wl_iw_get_range(
        IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN);
        IW_EVENT_CAPA_SET(range->event_capa, IWEVTXDROP);
        IW_EVENT_CAPA_SET(range->event_capa, IWEVMICHAELMICFAILURE);
+       IW_EVENT_CAPA_SET(range->event_capa, IWEVASSOCREQIE);
+       IW_EVENT_CAPA_SET(range->event_capa, IWEVASSOCRESPIE);
        IW_EVENT_CAPA_SET(range->event_capa, IWEVPMKIDCAND);
 #endif 
 
@@ -5473,7 +5532,15 @@ wl_iw_set_wpaauth(
        switch (paramid) {
        case IW_AUTH_WPA_VERSION:
                
-               iw->wpaversion = paramval;
+               if (paramval & IW_AUTH_WPA_VERSION_DISABLED)
+                       val = WPA_AUTH_DISABLED;
+               else if (paramval & (IW_AUTH_WPA_VERSION_WPA))
+                       val = WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED;
+               else if (paramval & IW_AUTH_WPA_VERSION_WPA2)
+                       val = WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED;
+               WL_ERROR(("%s: %d: setting wpa_auth to 0x%0x\n", __FUNCTION__, __LINE__, val));
+               if ((error = dev_wlc_intvar_set(dev, "wpa_auth", val)))
+                       return error;
                break;
 
        case IW_AUTH_CIPHER_PAIRWISE:
@@ -5491,7 +5558,27 @@ wl_iw_set_wpaauth(
                break;
 
        case IW_AUTH_KEY_MGMT:
-               if (paramval & IW_AUTH_KEY_MGMT_PSK) {
+               if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val)))
+                       return error;
+
+               if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED)) {
+                       if (paramval & IW_AUTH_KEY_MGMT_PSK)
+                               val = WPA_AUTH_PSK;
+                       else
+                               val = WPA_AUTH_UNSPECIFIED;
+                       if (paramval & 0x04)
+                               val |= WPA2_AUTH_FT;
+               }
+               else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED)) {
+                       if (paramval & IW_AUTH_KEY_MGMT_PSK)
+                               val = WPA2_AUTH_PSK;
+                       else
+                               val = WPA2_AUTH_UNSPECIFIED;
+                       if (paramval & 0x04)
+                               val |= WPA2_AUTH_FT;
+               }
+
+               else if (paramval & IW_AUTH_KEY_MGMT_PSK) {
                        if (iw->wpaversion == IW_AUTH_WPA_VERSION_WPA)
                                val = WPA_AUTH_PSK;
                        else if (iw->wpaversion == IW_AUTH_WPA_VERSION_WPA2)
@@ -7526,6 +7613,8 @@ wl_iw_set_priv(
                        ret = wl_iw_set_pno_reset(dev, info, (union iwreq_data *)dwrq, extra);
                else if (strnicmp(extra, PNOSETUP_SET_CMD, strlen(PNOSETUP_SET_CMD)) == 0)
                        ret = wl_iw_set_pno_set(dev, info, (union iwreq_data *)dwrq, extra);
+               else if (strnicmp(extra, PNOSETADD_SET_CMD, strlen(PNOSETADD_SET_CMD)) == 0)
+                       ret = wl_iw_set_pno_setadd(dev, info, (union iwreq_data *)dwrq, extra);
                else if (strnicmp(extra, PNOENABLE_SET_CMD, strlen(PNOENABLE_SET_CMD)) == 0)
                        ret = wl_iw_set_pno_enable(dev, info, (union iwreq_data *)dwrq, extra);
 #endif 
@@ -8251,6 +8340,21 @@ wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data)
 
                break;
        }
+
+       case WLC_E_ASSOC_REQ_IE:
+               cmd = IWEVASSOCREQIE;
+               wrqu.data.length = datalen;
+               if (datalen < sizeof(extra))
+                       memcpy(extra, data, datalen);
+               break;
+
+       case WLC_E_ASSOC_RESP_IE:
+               cmd = IWEVASSOCRESPIE;
+               wrqu.data.length = datalen;
+               if (datalen < sizeof(extra))
+                       memcpy(extra, data, datalen);
+               break;
+
        case WLC_E_PMKID_CACHE: {
                if (data)
                {
index c0cc14bdde4ebe41244ee4c391e2f63d76b97f68..faca5f72e223ff8e2a5f3462c0211a137eebcdb9 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: wl_iw.h,v 1.15.80.6 2010-12-23 01:13:23 Exp $
+ * $Id: wl_iw.h,v 1.15.80.6 2010-12-23 01:13:23 $
  */
 
 
 #define PNOSSIDCLR_SET_CMD                     "PNOSSIDCLR"
 
 #define PNOSETUP_SET_CMD                       "PNOSETUP " 
+#define PNOSETADD_SET_CMD                      "PNOSETADD"
 #define PNOENABLE_SET_CMD                      "PNOFORCE"
 #define PNODEBUG_SET_CMD                       "PNODEBUG"
-#define TXPOWER_SET_CMD                        "TXPOWER"
+#define TXPOWER_SET_CMD                                "TXPOWER"
 
 #define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
 #define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
@@ -226,6 +227,18 @@ extern void get_customized_country_code(char *country_iso_code, wl_country_t *cs
        iwe_stream_add_point(stream, ends, iwe, extra)
 #endif
 
+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,
+                       ushort  scan_fr, int pno_repeat, int pno_freq_expo_max);
+extern int dhd_pno_get_status(dhd_pub_t *dhd);
+extern int dhd_dev_pno_reset(struct net_device *dev);
+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);
+
 void   dhd_bus_country_set(struct net_device *dev, wl_country_t *cspec);
 
 #define PNO_TLV_PREFIX                 'S'