From c670bf779bbd4bc22d5a61e1a9a8b083bb63d7d5 Mon Sep 17 00:00:00 2001 From: Dmitry Shmidt Date: Tue, 25 Oct 2011 16:32:46 -0700 Subject: [PATCH] net: wireless: bcmdhd: Update to version 5.90.125.94 - Fix WFD interface removal - Fix profile update - Keep same mode for softap or WFD during early suspend - Add dhd_console_ms parameter access Signed-off-by: Dmitry Shmidt --- drivers/net/wireless/bcmdhd/dhd.h | 15 +- drivers/net/wireless/bcmdhd/dhd_common.c | 14 +- drivers/net/wireless/bcmdhd/dhd_linux.c | 74 +++--- drivers/net/wireless/bcmdhd/dhd_sdio.c | 6 +- drivers/net/wireless/bcmdhd/include/epivers.h | 8 +- drivers/net/wireless/bcmdhd/wl_android.c | 2 - drivers/net/wireless/bcmdhd/wl_cfg80211.c | 238 +++++++----------- drivers/net/wireless/bcmdhd/wl_cfg80211.h | 7 +- drivers/net/wireless/bcmdhd/wl_cfgp2p.h | 2 +- 9 files changed, 149 insertions(+), 217 deletions(-) diff --git a/drivers/net/wireless/bcmdhd/dhd.h b/drivers/net/wireless/bcmdhd/dhd.h index fae07abaad9d..0ea5d4a9961d 100644 --- a/drivers/net/wireless/bcmdhd/dhd.h +++ b/drivers/net/wireless/bcmdhd/dhd.h @@ -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 285209 2011-09-21 01:21:24Z $ + * $Id: dhd.h 290844 2011-10-20 08:54:39Z $ */ /**************** @@ -107,6 +107,15 @@ enum dhd_prealloc_index { DHD_PREALLOC_OSL_BUF }; +typedef enum { + DHD_IF_NONE = 0, + DHD_IF_ADD, + DHD_IF_DEL, + DHD_IF_CHANGE, + DHD_IF_DELETING +} dhd_if_state_t; + + #if defined(DHD_USE_STATIC_BUF) uint8* dhd_os_prealloc(void *osh, int section, uint size); @@ -412,6 +421,7 @@ extern int dhd_dev_pno_set(struct net_device *dev, wlc_ssid_t* ssids_local, 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); +extern bool dhd_check_ap_wfd_mode_set(dhd_pub_t *dhd); #define DHD_UNICAST_FILTER_NUM 0 #define DHD_BROADCAST_FILTER_NUM 1 @@ -476,8 +486,7 @@ extern uint dhd_bus_status(dhd_pub_t *dhdp); extern int dhd_bus_start(dhd_pub_t *dhdp); extern int dhd_bus_membytes(dhd_pub_t *dhdp, bool set, uint32 address, uint8 *data, uint size); extern void dhd_print_buf(void *pbuf, int len, int bytes_per_line); - -bool is_associated(dhd_pub_t *dhd, void *bss_buf); +extern bool dhd_is_associated(dhd_pub_t *dhd, void *bss_buf); #if defined(KEEP_ALIVE) extern int dhd_keep_alive_onoff(dhd_pub_t *dhd); diff --git a/drivers/net/wireless/bcmdhd/dhd_common.c b/drivers/net/wireless/bcmdhd/dhd_common.c index 8496f17bb059..2222b029f51c 100644 --- a/drivers/net/wireless/bcmdhd/dhd_common.c +++ b/drivers/net/wireless/bcmdhd/dhd_common.c @@ -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 284903 2011-09-20 02:36:51Z $ + * $Id: dhd_common.c 290546 2011-10-19 01:55:21Z $ */ #include #include @@ -101,8 +101,6 @@ const char dhd_version[] = "Dongle Host Driver, version " EPI_VERSION_STR; void dhd_set_timer(void *bus, uint wdtick); - - /* IOVar table */ enum { IOV_VERSION = 1, @@ -961,7 +959,7 @@ wl_host_event(dhd_pub_t *dhd_pub, int *ifidx, void *pktdata, { /* check whether packet is a BRCM event pkt */ bcm_event_t *pvt_data = (bcm_event_t *)pktdata; - char *event_data; + uint8 *event_data; uint32 type, status, reason, datalen; uint16 flags; int evlen; @@ -1529,8 +1527,6 @@ dhd_sendup_event_common(dhd_pub_t *dhdp, wl_event_msg_t *event, void *data) dhd_sendup_event(dhdp, event, data); } - - #ifdef SIMPLE_ISCAN uint iscan_thread_id = 0; @@ -1720,7 +1716,7 @@ fail: /* * returns = TRUE if associated, FALSE if not associated */ -bool is_associated(dhd_pub_t *dhd, void *bss_buf) +bool dhd_is_associated(dhd_pub_t *dhd, void *bss_buf) { char bssid[6], zbuf[6]; int ret = -1; @@ -1767,7 +1763,7 @@ dhd_get_dtim_skip(dhd_pub_t *dhd) bcn_li_dtim = dhd->dtim_skip; /* Check if associated */ - if (is_associated(dhd, NULL) == FALSE) { + if (dhd_is_associated(dhd, NULL) == FALSE) { DHD_TRACE(("%s NOT assoc ret %d\n", __FUNCTION__, ret)); goto exit; } @@ -1865,7 +1861,7 @@ dhd_pno_enable(dhd_pub_t *dhd, int pfn_enabled) memset(iovbuf, 0, sizeof(iovbuf)); - if ((pfn_enabled) && (is_associated(dhd, NULL) == TRUE)) { + if ((pfn_enabled) && (dhd_is_associated(dhd, NULL) == TRUE)) { DHD_ERROR(("%s pno is NOT enable : called in assoc mode , ignore\n", __FUNCTION__)); return ret; } diff --git a/drivers/net/wireless/bcmdhd/dhd_linux.c b/drivers/net/wireless/bcmdhd/dhd_linux.c index 5a96116501c7..014a40dc6c8c 100644 --- a/drivers/net/wireless/bcmdhd/dhd_linux.c +++ b/drivers/net/wireless/bcmdhd/dhd_linux.c @@ -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 287541 2011-10-03 23:48:17Z $ + * $Id: dhd_linux.c 291449 2011-10-22 12:16:26Z $ */ #include @@ -171,7 +171,7 @@ typedef struct dhd_if { struct net_device *net; struct net_device_stats stats; int idx; /* iface idx in dongle */ - int state; /* interface state */ + dhd_if_state_t state; /* interface state */ uint subunit; /* subunit */ uint8 mac_addr[ETHER_ADDR_LEN]; /* assigned MAC address */ bool attached; /* Delayed attachment when unset */ @@ -306,7 +306,7 @@ module_param(dhd_watchdog_ms, uint, 0); #if defined(DHD_DEBUG) /* Console poll interval */ uint dhd_console_ms = 0; -module_param(dhd_console_ms, uint, 0); +module_param(dhd_console_ms, uint, 0644); #endif /* defined(DHD_DEBUG) */ /* ARP offload agent mode : Enable ARP Host Auto-Reply and ARP Peer Auto-Reply */ @@ -327,7 +327,7 @@ module_param(dhd_pkt_filter_init, uint, 0); /* Pkt filter mode control */ uint dhd_master_mode = TRUE; -module_param(dhd_master_mode, uint, 1); +module_param(dhd_master_mode, uint, 0); #ifdef DHDTHREAD /* Watchdog thread priority, -1 to use kernel timer */ @@ -349,7 +349,7 @@ uint dhd_roam_disable = 0; uint dhd_radio_up = 1; /* Network inteface name */ -char iface_name[IFNAMSIZ]; +char iface_name[IFNAMSIZ] = {'\0'}; module_param_string(iface_name, iface_name, IFNAMSIZ, 0); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) @@ -591,7 +591,7 @@ static void dhd_suspend_resume_helper(struct dhd_info *dhd, int val) DHD_OS_WAKE_LOCK(dhdp); /* Set flag when early suspend was called */ dhdp->in_suspend = val; - if (!dhdp->suspend_disable_flag) + if ((!dhdp->suspend_disable_flag) && (dhd_check_ap_wfd_mode_set(dhdp) == FALSE)) dhd_set_suspend(val, dhdp); DHD_OS_WAKE_UNLOCK(dhdp); } @@ -951,7 +951,7 @@ dhd_op_if(dhd_if_t *ifp) #endif switch (ifp->state) { - case WLC_E_IF_ADD: + case DHD_IF_ADD: /* * Delete the existing interface before overwriting it * in case we missed the WLC_E_IF_DEL event. @@ -976,7 +976,7 @@ dhd_op_if(dhd_if_t *ifp) if (dhd->dhd_state & DHD_ATTACH_STATE_CFG80211) if (!wl_cfg80211_notify_ifadd(ifp->net, ifp->idx, ifp->bssidx, dhd_net_attach)) { - ifp->state = 0; + ifp->state = DHD_IF_NONE; return; } #endif @@ -999,21 +999,28 @@ dhd_op_if(dhd_if_t *ifp) #endif DHD_TRACE(("\n ==== pid:%x, net_device for if:%s created ===\n\n", current->pid, ifp->net->name)); - ifp->state = 0; + ifp->state = DHD_IF_NONE; } } break; - case WLC_E_IF_DEL: + case DHD_IF_DEL: + /* Make sure that we don't enter again here if .. */ + /* dhd_op_if is called again from some other context */ + ifp->state = DHD_IF_DELETING; if (ifp->net != NULL) { - DHD_TRACE(("\n%s: got 'WLC_E_IF_DEL' state\n", __FUNCTION__)); + DHD_TRACE(("\n%s: got 'DHD_IF_DEL' state\n", __FUNCTION__)); #ifdef WL_CFG80211 - wl_cfg80211_ifdel_ops(ifp->net); + if (dhd->dhd_state & DHD_ATTACH_STATE_CFG80211) { + wl_cfg80211_notify_ifdel(ifp->net); + } #endif netif_stop_queue(ifp->net); unregister_netdev(ifp->net); ret = DHD_DEL_IF; /* Make sure the free_netdev() is called */ } break; + case DHD_IF_DELETING: + break; default: DHD_ERROR(("%s: bad op %d\n", __FUNCTION__, ifp->state)); ASSERT(!ifp->state); @@ -1026,11 +1033,6 @@ dhd_op_if(dhd_if_t *ifp) free_netdev(ifp->net); } dhd->iflist[ifp->idx] = NULL; -#ifdef WL_CFG80211 - if (dhd->dhd_state & DHD_ATTACH_STATE_CFG80211) { - wl_cfg80211_notify_ifdel(ifp->net); - } -#endif #ifdef SOFTAP flags = dhd_os_spin_lock(&dhd->pub); if (ifp->net == ap_net_dev) @@ -1076,7 +1078,6 @@ _dhd_sysioc_thread(void *data) in_ap = (ap_net_dev != NULL); dhd_os_spin_unlock(&dhd->pub, flags); #endif /* SOFTAP */ - if (dhd->iflist[i] && dhd->iflist[i]->state) dhd_op_if(dhd->iflist[i]); @@ -1085,7 +1086,6 @@ _dhd_sysioc_thread(void *data) "!\n\n", __FUNCTION__, i)); continue; } - #ifdef SOFTAP if (in_ap && dhd->set_macaddress) { DHD_TRACE(("attempt to set MAC for %s in AP Mode," @@ -2234,8 +2234,9 @@ dhd_cleanup_virt_ifaces(dhd_info_t *dhd) for (i = 1; i < DHD_MAX_IFS; i++) { if (dhd->iflist[i]) { DHD_TRACE(("Deleting IF: %d \n", i)); - if (dhd->iflist[i]->state != WLC_E_IF_DEL) { - dhd->iflist[i]->state = WLC_E_IF_DEL; + if ((dhd->iflist[i]->state != DHD_IF_DEL) && + (dhd->iflist[i]->state != DHD_IF_DELETING)) { + dhd->iflist[i]->state = DHD_IF_DEL; dhd->iflist[i]->idx = i; dhd_op_if(dhd->iflist[i]); } @@ -2267,7 +2268,8 @@ dhd_stop(struct net_device *net) if (ifidx == 0) { wl_cfg80211_down(); - /** For CFG80211: Clean up all the left over virtual interfaces + /* + * For CFG80211: Clean up all the left over virtual interfaces * when the primary Interface is brought down. [ifconfig wlan0 down] */ if ((dhd->dhd_state & DHD_ATTACH_STATE_ADD_IF) && @@ -2320,9 +2322,10 @@ dhd_open(struct net_device *net) } #if !defined(WL_CFG80211) - /** Force start if ifconfig_up gets called before START command - * We keep WEXT's wl_control_wl_start to provide backward compatibility - * This should be removed in the future + /* + * Force start if ifconfig_up gets called before START command + * We keep WEXT's wl_control_wl_start to provide backward compatibility + * This should be removed in the future */ wl_control_wl_start(net); #endif @@ -2336,7 +2339,7 @@ dhd_open(struct net_device *net) goto exit; } - if (!dhd->iflist[ifidx] || dhd->iflist[ifidx]->state == WLC_E_IF_DEL) { + if (!dhd->iflist[ifidx] || dhd->iflist[ifidx]->state == DHD_IF_DEL) { DHD_ERROR(("%s: Error: called when IF already deleted\n", __FUNCTION__)); ret = -1; goto exit; @@ -2446,7 +2449,7 @@ dhd_add_if(dhd_info_t *dhd, int ifidx, void *handle, char *name, memcpy(&ifp->mac_addr, mac_addr, ETHER_ADDR_LEN); if (handle == NULL) { - ifp->state = WLC_E_IF_ADD; + ifp->state = DHD_IF_ADD; ifp->idx = ifidx; ifp->bssidx = bssidx; ASSERT(&dhd->thr_sysioc_ctl.thr_pid >= 0); @@ -2471,7 +2474,7 @@ dhd_del_if(dhd_info_t *dhd, int ifidx) return; } - ifp->state = WLC_E_IF_DEL; + ifp->state = DHD_IF_DEL; ifp->idx = ifidx; ASSERT(&dhd->thr_sysioc_ctl.thr_pid >= 0); up(&dhd->thr_sysioc_ctl.sema); @@ -3413,8 +3416,9 @@ dhd_bus_detach(dhd_pub_t *dhdp) dhd = (dhd_info_t *)dhdp->info; if (dhd) { - /** In case of Android cfg80211 driver, the bus is down in dhd_stop, - * calling stop again will cuase SD read/write errors. + /* + * In case of Android cfg80211 driver, the bus is down in dhd_stop, + * calling stop again will cuase SD read/write errors. */ if (dhd->pub.busstate != DHD_BUS_DOWN) { /* Stop the protocol module */ @@ -3484,7 +3488,7 @@ void dhd_detach(dhd_pub_t *dhdp) /* Cleanup virtual interfaces */ for (i = 1; i < DHD_MAX_IFS; i++) if (dhd->iflist[i]) { - dhd->iflist[i]->state = WLC_E_IF_DEL; + dhd->iflist[i]->state = DHD_IF_DEL; dhd->iflist[i]->idx = i; dhd_op_if(dhd->iflist[i]); } @@ -3800,8 +3804,6 @@ dhd_os_open_image(char *filename) { struct file *fp; - /* wl_cfg80211_request_fw(filename); */ - fp = filp_open(filename, O_RDONLY, 0); /* * 2.6.11 (FC4) supports filp_open() but later revs don't? @@ -3821,8 +3823,6 @@ dhd_os_get_image_block(char *buf, int len, void *image) struct file *fp = (struct file *)image; int rdlen; - /* wl_cfg80211_read_fw(buf, len); */ - if (!image) return 0; @@ -3836,8 +3836,6 @@ dhd_os_get_image_block(char *buf, int len, void *image) void dhd_os_close_image(void *image) { - /* wl_cfg80211_release_fw(); */ - if (image) filp_close((struct file *)image, NULL); } @@ -3890,10 +3888,12 @@ dhd_os_sdunlock_txq(dhd_pub_t *pub) dhd = (dhd_info_t *)(pub->info); spin_unlock_bh(&dhd->txqlock); } + void dhd_os_sdlock_rxq(dhd_pub_t *pub) { } + void dhd_os_sdunlock_rxq(dhd_pub_t *pub) { diff --git a/drivers/net/wireless/bcmdhd/dhd_sdio.c b/drivers/net/wireless/bcmdhd/dhd_sdio.c index 361b2a2e1cd9..29301159cbd2 100644 --- a/drivers/net/wireless/bcmdhd/dhd_sdio.c +++ b/drivers/net/wireless/bcmdhd/dhd_sdio.c @@ -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 285933 2011-09-23 21:45:31Z $ + * $Id: dhd_sdio.c 288105 2011-10-06 01:58:02Z $ */ #include @@ -468,7 +468,7 @@ static void dhdsdio_sdtest_set(dhd_bus_t *bus, uint8 count); #endif #ifdef DHD_DEBUG -static int dhdsdio_checkdied(dhd_bus_t *bus, uint8 *data, uint size); +static int dhdsdio_checkdied(dhd_bus_t *bus, char *data, uint size); static int dhd_serialconsole(dhd_bus_t *bus, bool get, bool enable, int *bcmerror); #endif /* DHD_DEBUG */ @@ -1937,7 +1937,7 @@ break2: } static int -dhdsdio_checkdied(dhd_bus_t *bus, uint8 *data, uint size) +dhdsdio_checkdied(dhd_bus_t *bus, char *data, uint size) { int bcmerror = 0; uint msize = 512; diff --git a/drivers/net/wireless/bcmdhd/include/epivers.h b/drivers/net/wireless/bcmdhd/include/epivers.h index 63db714ae883..ae1f975bdb64 100644 --- a/drivers/net/wireless/bcmdhd/include/epivers.h +++ b/drivers/net/wireless/bcmdhd/include/epivers.h @@ -33,17 +33,17 @@ #define EPI_RC_NUMBER 125 -#define EPI_INCREMENTAL_NUMBER 87 +#define EPI_INCREMENTAL_NUMBER 94 #define EPI_BUILD_NUMBER 0 -#define EPI_VERSION 5, 90, 125, 87 +#define EPI_VERSION 5, 90, 125, 94 -#define EPI_VERSION_NUM 0x055a7d57 +#define EPI_VERSION_NUM 0x055a7d5e #define EPI_VERSION_DEV 5.90.125 -#define EPI_VERSION_STR "5.90.125.87" +#define EPI_VERSION_STR "5.90.125.94" #endif diff --git a/drivers/net/wireless/bcmdhd/wl_android.c b/drivers/net/wireless/bcmdhd/wl_android.c index ccb9aa855d07..76df647b6778 100644 --- a/drivers/net/wireless/bcmdhd/wl_android.c +++ b/drivers/net/wireless/bcmdhd/wl_android.c @@ -384,8 +384,6 @@ int wl_android_wifi_off(struct net_device *dev) if (g_wifi_on) { dhd_dev_reset(dev, 1); sdioh_stop(NULL); - /* clean up dtim_skip setting */ - net_os_set_dtim_skip(dev, TRUE); dhd_customer_gpio_wlan_ctrl(WLAN_RESET_OFF); g_wifi_on = 0; } diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/bcmdhd/wl_cfg80211.c index 6a3003244261..0f01310f9688 100644 --- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c +++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.c @@ -29,13 +29,6 @@ #include #include -/* - * sys proc file will be REMOVED in next release - */ -#if defined(DHD_P2P_DEV_ADDR_FROM_SYSFS) && defined(CONFIG_SYSCTL) -#include -#endif - #include #include #include @@ -84,43 +77,6 @@ u32 wl_dbg_level = WL_DBG_ERR; #define MAX_WAIT_TIME 1500 static s8 ioctlbuf[WLC_IOCTL_MAXLEN]; -#if defined(DHD_P2P_DEV_ADDR_FROM_SYSFS) && defined(CONFIG_SYSCTL) -#define MAC_STRING_LEN (sizeof(u8) * 17) -u8 wl_sysctl_macstring[2][MAC_STRING_LEN]; - -static ctl_table wl_sysctl_child[] = { - { - .procname = "p2p_dev_addr", - .data = &wl_sysctl_macstring[0], - .maxlen = MAC_STRING_LEN, - .mode = 0444, - .child = NULL, - .proc_handler = proc_dostring, - }, - { - .procname = "p2p_int_addr", - .data = &wl_sysctl_macstring[1], - .maxlen = MAC_STRING_LEN, - .mode = 0444, - .child = NULL, - .proc_handler = proc_dostring, - }, - {0} -}; -static ctl_table wl_sysctl_table[] = { - { - .procname = "wifi", - .data = NULL, - .maxlen = 0, - .mode = 0555, - .child = wl_sysctl_child, - .proc_handler = NULL, - }, - {0} -}; -static struct ctl_table_header *wl_sysctl_hdr; -#endif /* CONFIG_SYSCTL */ - #define COEX_DHCP #if defined(COEX_DHCP) @@ -633,7 +589,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 */ @@ -843,11 +799,10 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, return NULL; } if (wl->p2p_supported && (wlif_type != -1)) { - if (wl_get_p2p_status(wl, IF_DELETING) == 1) { + if (wl_get_p2p_status(wl, IF_DELETING)) { /* wait till IF_DEL is complete * release the lock for the unregister to proceed */ - /* put back the rtnl_lock again */ if (rtnl_is_locked()) { rtnl_unlock(); rollback_lock = true; @@ -867,7 +822,7 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, WL_ERR(("IF DEL is Success\n")); } else { - WL_ERR(("%s: timeount < 0, return -EAGAIN\n", __func__)); + WL_ERR(("timeount < 0, return -EAGAIN\n")); return ERR_PTR(-EAGAIN); } } @@ -876,7 +831,6 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, wl_cfgp2p_set_firm_p2p(wl); wl_cfgp2p_init_discovery(wl); } - memset(wl->p2p->vir_ifname, 0, IFNAMSIZ); strncpy(wl->p2p->vir_ifname, name, IFNAMSIZ - 1); wl_cfgp2p_generate_bss_mac(&dhd->mac, &wl->p2p->dev_addr, &wl->p2p->int_addr); @@ -920,15 +874,14 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, wl->p2p->vif_created = true; set_mode_by_netdev(wl, _ndev, mode); net_attach = wl_to_p2p_bss_private(wl, P2PAPI_BSSCFG_CONNECTION); - /* put back the rtnl_lock again */ if (rtnl_is_locked()) { rtnl_unlock(); rollback_lock = true; } - if (net_attach && !net_attach(dhd, _ndev->ifindex)) + if (net_attach && !net_attach(dhd, _ndev->ifindex)) { WL_DBG((" virtual interface(%s) is " "created net attach done\n", wl->p2p->vir_ifname)); - else { + } else { /* put back the rtnl_lock again */ if (rollback_lock) rtnl_lock(); @@ -965,8 +918,8 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev) wl_cfg80211_scan_abort(wl, dev); } wldev_iovar_setint(dev, "mpc", 1); - ret = wl_cfgp2p_ifdel(wl, &p2p_mac); wl_set_p2p_status(wl, IF_DELETING); + ret = wl_cfgp2p_ifdel(wl, &p2p_mac); if (ret) { /* Firmware could not delete the interface so we will not get WLC_E_IF * event for cleaning the dhd virtual nw interace @@ -982,12 +935,12 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev) /* Wait for any pending scan req to get aborted from the sysioc context */ timeout = wait_event_interruptible_timeout(wl->dongle_event_wait, - (wl->scan_request == false), + (wl_get_p2p_status(wl, IF_DELETING) == false), msecs_to_jiffies(MAX_WAIT_TIME)); - if (timeout > 0 && (!wl->scan_request)) { - WL_DBG(("IFDEL Operations Done")); + if (timeout > 0 && !wl_get_p2p_status(wl, IF_DELETING)) { + WL_DBG(("IFDEL operation done\n")); } else { - WL_ERR(("IFDEL didn't complete properly")); + WL_ERR(("IFDEL didn't complete properly\n")); } ret = dhd_del_monitor(dev); } @@ -1073,24 +1026,24 @@ wl_cfg80211_change_virtual_iface(struct wiphy *wiphy, struct net_device *ndev, } s32 -wl_cfg80211_notify_ifadd(struct net_device *net, s32 idx, s32 bssidx, +wl_cfg80211_notify_ifadd(struct net_device *ndev, s32 idx, s32 bssidx, int (*_net_attach)(dhd_pub_t *dhdp, int ifidx)) { struct wl_priv *wl = wlcfg_drv_priv; s32 ret = BCME_OK; - if (!net) { + if (!ndev) { WL_ERR(("net is NULL\n")); return 0; } if (wl->p2p_supported) { WL_DBG(("IF_ADD event called from dongle, old interface name: %s," - "new name: %s\n", net->name, wl->p2p->vir_ifname)); + "new name: %s\n", ndev->name, wl->p2p->vir_ifname)); /* Assign the net device to CONNECT BSSCFG */ - strncpy(net->name, wl->p2p->vir_ifname, IFNAMSIZ - 1); - wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION) = net; + strncpy(ndev->name, wl->p2p->vir_ifname, IFNAMSIZ - 1); + wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION) = ndev; wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_CONNECTION) = bssidx; wl_to_p2p_bss_private(wl, P2PAPI_BSSCFG_CONNECTION) = _net_attach; - net->ifindex = idx; + ndev->ifindex = idx; wl_clr_p2p_status(wl, IF_ADD); wake_up_interruptible(&wl->dongle_event_wait); @@ -1099,64 +1052,44 @@ int (*_net_attach)(dhd_pub_t *dhdp, int ifidx)) } s32 -wl_cfg80211_ifdel_ops(struct net_device *net) +wl_cfg80211_notify_ifdel(struct net_device *ndev) { struct wl_priv *wl = wlcfg_drv_priv; - int rollback_lock = FALSE; + bool rollback_lock = false; + s32 index = 0; - if (!net || !net->name) { - WL_DBG(("net is NULL\n")); + if (!ndev || !ndev->name) { + WL_ERR(("net is NULL\n")); return 0; } - if ((wl->p2p->vif_created) && (wl->scan_request)) { - - /* Abort any pending scan requests */ - wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; - if (!rtnl_is_locked()) { - rtnl_lock(); - rollback_lock = TRUE; + if (p2p_is_on(wl) && wl->p2p->vif_created) { + if (wl->scan_request) { + /* Abort any pending scan requests */ + wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; + if (!rtnl_is_locked()) { + rtnl_lock(); + rollback_lock = true; + } + WL_DBG(("ESCAN COMPLETED\n")); + wl_notify_escan_complete(wl, true); + if (rollback_lock) + rtnl_unlock(); } - WL_INFO(("ESCAN COMPLETED\n")); - wl_notify_escan_complete(wl, true); - - if (rollback_lock) - rtnl_unlock(); - } - - /* Wake up any waiting thread */ - wake_up_interruptible(&wl->dongle_event_wait); - - return 0; -} - -s32 -wl_cfg80211_notify_ifdel(struct net_device *net) -{ - struct wl_priv *wl = wlcfg_drv_priv; - - if (wl->p2p && wl->p2p->vif_created) { - s32 index = 0; - WL_DBG(("IF_DEL event called from dongle, net %x, vif name: %s\n", - (unsigned int)net, wl->p2p->vir_ifname)); + WL_ERR(("IF_DEL event called from dongle, net %x, vif name: %s\n", + (unsigned int)ndev, wl->p2p->vir_ifname)); memset(wl->p2p->vir_ifname, '\0', IFNAMSIZ); - index = wl_cfgp2p_find_idx(wl, net); + index = wl_cfgp2p_find_idx(wl, ndev); wl_to_p2p_bss_ndev(wl, index) = NULL; wl_to_p2p_bss_bssidx(wl, index) = 0; wl->p2p->vif_created = false; - set_mode_by_netdev(wl, net, -1); wl_cfgp2p_clear_management_ie(wl, index); - index = get_idx_vwdev_by_netdev(wl, net); + wl_clr_p2p_status(wl, IF_DELETING); WL_DBG(("index : %d\n", index)); - if (index >= 0) { - free_vwdev_by_index(wl, index); - } - } - - wl_clr_p2p_status(wl, IF_DELETING); + } /* Wake up any waiting thread */ wake_up_interruptible(&wl->dongle_event_wait); @@ -1914,9 +1847,9 @@ wl_set_wpa_version(struct net_device *dev, struct cfg80211_connect_params *sme) s32 bssidx = wl_cfgp2p_find_idx(wl, dev); if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_1) - val = WPA_AUTH_PSK; /* | WPA_AUTH_UNSPECIFIED; */ + val = WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED; else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2) - val = WPA2_AUTH_PSK; /* | WPA2_AUTH_UNSPECIFIED ; */ + val = WPA2_AUTH_PSK| WPA2_AUTH_UNSPECIFIED; else val = WPA_AUTH_DISABLED; @@ -2031,7 +1964,9 @@ wl_set_set_cipher(struct net_device *dev, struct cfg80211_connect_params *sme) if (is_wps_conn(sme)) { err = wldev_iovar_setint_bsscfg(dev, "wsec", 4, bssidx); } else { - err = wldev_iovar_setint_bsscfg(dev, "wsec", pval | gval, bssidx); + WL_DBG((" NO, is_wps_conn, Set pval | gval to WSEC")); + err = wldev_iovar_setint_bsscfg(dev, "wsec", + pval | gval, bssidx); } if (unlikely(err)) { WL_ERR(("error (%d)\n", err)); @@ -2087,7 +2022,6 @@ wl_set_key_mgmt(struct net_device *dev, struct cfg80211_connect_params *sme) return -EINVAL; } } - WL_DBG(("setting wpa_auth to %d\n", val)); err = wldev_iovar_setint_bsscfg(dev, "wpa_auth", val, bssidx); @@ -2197,7 +2131,6 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, if (wl->scan_request) { wl_cfg80211_scan_abort(wl, dev); } - /* Clean BSSID */ bzero(&bssid, sizeof(bssid)); wl_update_prof(wl, NULL, (void *)&bssid, WL_PROF_BSSID); @@ -2409,10 +2342,11 @@ wl_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, scb_val_t scbval; bool act = false; s32 err = 0; - + 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)) { /* * Cancel ongoing scan to sync up with sme state machine of cfg80211. @@ -2422,7 +2356,7 @@ wl_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, } wl_set_drv_status(wl, DISCONNECTING); scbval.val = reason_code; - memcpy(&scbval.ea, &wl->bssid, ETHER_ADDR_LEN); + memcpy(&scbval.ea, curbssid, ETHER_ADDR_LEN); scbval.val = htod32(scbval.val); err = wldev_ioctl(dev, WLC_DISASSOC, &scbval, sizeof(scb_val_t), true); @@ -2842,7 +2776,6 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); CHECK_SYS_UP(wl); - WL_DBG((" Enter\n")); if (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)); @@ -2871,12 +2804,11 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, u8 *curmacp = wl_read_prof(wl, WL_PROF_BSSID); if (!wl_get_drv_status(wl, CONNECTED) || - (is_associated(dhd, NULL) == FALSE)) { + (dhd_is_associated(dhd, NULL) == FALSE)) { WL_ERR(("NOT assoc\n")); err = -ENODEV; goto get_station_err; } - if (memcmp(mac, curmacp, ETHER_ADDR_LEN)) { WL_ERR(("Wrong Mac address: "MACSTR" != "MACSTR"\n", MAC2STR(mac), MAC2STR(curmacp))); @@ -2909,6 +2841,7 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, 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); cfg80211_disconnected(dev, 0, NULL, 0, GFP_KERNEL); @@ -3299,6 +3232,7 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev, u32 wpsie_len = 0; u16 fc; bool ack = false; + wifi_p2p_pub_act_frame_t *act_frm; WL_DBG(("Enter \n")); /* find bssidx based on ndev */ bssidx = wl_cfgp2p_find_idx(wl, dev); @@ -3397,12 +3331,11 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev, memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN], action_frame->len); + act_frm = (wifi_p2p_pub_act_frame_t *) (action_frame->data); + WL_DBG(("action_frame->len: %d chan %d category %d subtype %d\n", + action_frame->len, af_params->channel, + act_frm->category, act_frm->subtype)); if (wl->p2p->vif_created) { - wifi_p2p_pub_act_frame_t *act_frm = - (wifi_p2p_pub_act_frame_t *) (action_frame->data); - WL_DBG(("action_frame->len: %d chan %d category %d subtype %d\n", - action_frame->len, af_params->channel, - act_frm->category, act_frm->subtype)); /* * To make sure to send successfully action frame, we have to turn off mpc */ @@ -3476,8 +3409,10 @@ wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev, 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)); - wldev_ioctl(dev, WLC_SET_CHANNEL, &channel, sizeof(channel), true); - + err = wldev_ioctl(dev, WLC_SET_CHANNEL, &channel, sizeof(channel), true); + if (err < 0) { + WL_ERR(("WLC_SET_CHANNEL error %d chip may not be supporting this channel\n", err)); + } return err; } @@ -4280,18 +4215,6 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi) signal = notif_bss_info->rssi * 100; - if (wl->p2p_supported && p2p_on(wl)) { - /* &&TODO !memcmp(mgmt->bssid, wl_to_p2p_bss(wl, P2PAPI_BSSCFG_DEVICE), bi->SSID_len) */ - /* && TODO !memcmp(bi->SSID, wl_to_p2p_bss(wl, P2PAPI_BSSCFG_CONNECTION), bi->SSID_len) */ - /* find the P2PIE, if we do not find it, we will discard this frame */ - wifi_p2p_ie_t * p2p_ie; - if ((p2p_ie = wl_cfgp2p_find_p2pie((u8 *)beacon_proberesp->variable, - wl_get_ielen(wl))) == NULL) { - WL_ERR(("Couldn't find P2PIE in probe response/beacon\n")); - kfree(notif_bss_info); - return err; - } - } if (unlikely(!cfg80211_inform_bss_frame(wiphy, channel, mgmt, le16_to_cpu(notif_bss_info->frame_len), signal, GFP_KERNEL))) { @@ -4444,7 +4367,7 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev, wl_link_up(wl); act = true; wl_update_prof(wl, e, &act, WL_PROF_ACT); - wl_update_prof(wl, NULL, (void *)&e->addr, WL_PROF_BSSID); + wl_update_prof(wl, NULL, (void *)(e->addr.octet), WL_PROF_BSSID); if (wl_is_ibssmode(wl, ndev)) { printk("cfg80211_ibss_joined\n"); cfg80211_ibss_joined(ndev, (s8 *)&e->addr, @@ -4471,13 +4394,15 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev, } if (wl_get_drv_status(wl, CONNECTED)) { scb_val_t scbval; + u8 *curbssid = wl_read_prof(wl, WL_PROF_BSSID); printk("link down, call cfg80211_disconnected\n"); wl_clr_drv_status(wl, CONNECTED); /* To make sure disconnect, explictly send dissassoc * for BSSID 00:00:00:00:00:00 issue */ scbval.val = WLAN_REASON_DEAUTH_LEAVING; - memcpy(&scbval.ea, &wl->bssid, ETHER_ADDR_LEN); + + memcpy(&scbval.ea, curbssid, ETHER_ADDR_LEN); scbval.val = htod32(scbval.val); wldev_ioctl(ndev, WLC_DISASSOC, &scbval, sizeof(scb_val_t), true); @@ -4529,7 +4454,7 @@ wl_notify_roaming_status(struct wl_priv *wl, struct net_device *ndev, 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, WL_PROF_BSSID); + wl_update_prof(wl, NULL, (void *)(e->addr.octet), WL_PROF_BSSID); } return err; } @@ -4681,6 +4606,7 @@ static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev) u8 dtim_period; size_t ie_len; u8 *ie; + u8 *curbssid; s32 err = 0; struct wiphy *wiphy; wiphy = wl_to_wiphy(wl); @@ -4689,7 +4615,8 @@ static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev) return err; ssid = (struct wlc_ssid *)wl_read_prof(wl, WL_PROF_SSID); - bss = cfg80211_get_bss(wiphy, NULL, (s8 *)&wl->bssid, + curbssid = wl_read_prof(wl, WL_PROF_BSSID); + bss = cfg80211_get_bss(wiphy, NULL, curbssid, ssid->SSID, ssid->SSID_len, WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); @@ -4697,14 +4624,14 @@ static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev) if (unlikely(!bss)) { WL_DBG(("Could not find the AP\n")); *(u32 *) wl->extra_buf = htod32(WL_EXTRA_BUF_MAX); - err = wldev_ioctl(wl_to_prmry_ndev(wl), WLC_GET_BSS_INFO, + err = wldev_ioctl(ndev, WLC_GET_BSS_INFO, wl->extra_buf, WL_EXTRA_BUF_MAX, false); if (unlikely(err)) { WL_ERR(("Could not get bss info %d\n", err)); goto update_bss_info_out; } bi = (struct wl_bss_info *)(wl->extra_buf + 4); - if (unlikely(memcmp(&bi->BSSID, &wl->bssid, ETHER_ADDR_LEN))) { + if (memcmp(bi->BSSID.octet, curbssid, ETHER_ADDR_LEN)) { err = -EIO; goto update_bss_info_out; } @@ -4732,7 +4659,7 @@ static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev) * information out of probe response. * so we speficially query dtim information to dongle. */ - err = wldev_ioctl(wl_to_prmry_ndev(wl), WLC_GET_DTIMPRD, + err = wldev_ioctl(ndev, WLC_GET_DTIMPRD, &dtim_period, sizeof(dtim_period), false); if (unlikely(err)) { WL_ERR(("WLC_GET_DTIMPRD error (%d)\n", err)); @@ -4754,16 +4681,18 @@ wl_bss_roaming_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_get_assoc_ies(wl, ndev); - memcpy(&wl->bssid, &e->addr, ETHER_ADDR_LEN); + wl_update_prof(wl, NULL, (void *)(e->addr.octet), WL_PROF_BSSID); + curbssid = wl_read_prof(wl, WL_PROF_BSSID); wl_update_bss_info(wl, ndev); wl_update_pmklist(ndev, wl->pmk_list, err); cfg80211_roamed(ndev, #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) NULL, #endif - (u8 *)&wl->bssid, + curbssid, conn_info->req_ie, conn_info->req_ie_len, conn_info->resp_ie, conn_info->resp_ie_len, GFP_KERNEL); WL_DBG(("Report roaming result\n")); @@ -4779,7 +4708,7 @@ 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); WL_DBG((" enter\n")); if (wl->scan_request) { wl_cfg80211_scan_abort(wl, ndev); @@ -4788,13 +4717,14 @@ wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev, wl_clr_drv_status(wl, CONNECTING); if (completed) { wl_get_assoc_ies(wl, ndev); - memcpy(&wl->bssid, &e->addr, ETHER_ADDR_LEN); + wl_update_prof(wl, NULL, (void *)(e->addr.octet), WL_PROF_BSSID); + curbssid = wl_read_prof(wl, WL_PROF_BSSID); wl_update_bss_info(wl, ndev); wl_update_pmklist(ndev, wl->pmk_list, err); wl_set_drv_status(wl, CONNECTED); } cfg80211_connect_result(ndev, - (u8 *)&wl->bssid, + curbssid, conn_info->req_ie, conn_info->req_ie_len, conn_info->resp_ie, @@ -4944,7 +4874,7 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, u8 *mgmt_frame; u8 bsscfgidx = e->bsscfgidx; u32 mgmt_frame_len = ntoh32(e->datalen) - sizeof(wl_event_rx_frame_data_t); - u16 channel = ((ntoh16(rxframe->channel) & WL_CHANSPEC_CHAN_MASK) & 0x0f); + u16 channel = ((ntoh16(rxframe->channel) & WL_CHANSPEC_CHAN_MASK)); memset(&bssid, 0, ETHER_ADDR_LEN); if (channel <= CH_MAX_2G_CHANNEL) @@ -4960,6 +4890,7 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, if (event == WLC_E_ACTION_FRAME_RX) { wldev_iovar_getbuf_bsscfg(ndev, "cur_etheraddr", NULL, 0, ioctlbuf, sizeof(ioctlbuf), bsscfgidx); + wldev_ioctl(ndev, 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, @@ -5023,7 +4954,6 @@ static void wl_init_event_handler(struct wl_priv *wl) memset(wl->evt_handler, 0, sizeof(wl->evt_handler)); wl->evt_handler[WLC_E_SCAN_COMPLETE] = wl_notify_scan_status; - /* wl->evt_handler[WLC_E_JOIN] = wl_notify_connect_status; */ wl->evt_handler[WLC_E_LINK] = wl_notify_connect_status; wl->evt_handler[WLC_E_DEAUTH_IND] = wl_notify_connect_status; wl->evt_handler[WLC_E_DEAUTH] = wl_notify_connect_status; @@ -5347,7 +5277,10 @@ static void wl_scan_timeout(unsigned long data) if (wl->scan_request) { WL_ERR(("timer expired\n")); - wl_notify_escan_complete(wl, true); + if (wl->escan_on) + wl_notify_escan_complete(wl, true); + else + wl_notify_iscan_complete(wl_to_iscan(wl), true); } } @@ -6377,13 +6310,14 @@ static s32 __wl_cfg80211_down(struct wl_priv *wl) wl_clr_drv_status(wl, CONNECTING); wl_clr_drv_status(wl, CONNECTED); wl_clr_drv_status(wl, DISCONNECTING); - dhd_os_spin_unlock((dhd_pub_t *)(wl->pub), flags); if (wl_get_drv_status(wl, AP_CREATED)) { wl_clr_drv_status(wl, AP_CREATED); wl_clr_drv_status(wl, AP_CREATING); - wl_to_prmry_ndev(wl)->ieee80211_ptr->iftype = - NL80211_IFTYPE_STATION; } + wl_to_prmry_ndev(wl)->ieee80211_ptr->iftype = + NL80211_IFTYPE_STATION; + dhd_os_spin_unlock((dhd_pub_t *)(wl->pub), flags); + wl->dongle_up = false; wl_flush_eq(wl); wl_link_down(wl); diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.h b/drivers/net/wireless/bcmdhd/wl_cfg80211.h index 8403ccebef31..262335ef99c2 100644 --- a/drivers/net/wireless/bcmdhd/wl_cfg80211.h +++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.h @@ -380,7 +380,6 @@ struct wl_priv { struct wl_cfg80211_bss_info *bss_info; /* information element object for internal purpose */ struct wl_ie ie; - struct ether_addr bssid; /* bssid of currently engaged network */ /* for synchronization of main event thread */ struct wl_profile *profile; /* holding dongle profile */ @@ -531,8 +530,7 @@ 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_ifdel_ops(struct net_device *net); -extern s32 wl_cfg80211_notify_ifdel(struct net_device *net); +extern s32 wl_cfg80211_notify_ifdel(struct net_device *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); @@ -550,9 +548,6 @@ 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); -#ifdef CONFIG_SYSCTL -extern s32 wl_cfg80211_sysctl_export_devaddr(void *data); -#endif /* do scan abort */ extern s32 diff --git a/drivers/net/wireless/bcmdhd/wl_cfgp2p.h b/drivers/net/wireless/bcmdhd/wl_cfgp2p.h index a7fdf7662e9f..5a69168c6a3a 100644 --- a/drivers/net/wireless/bcmdhd/wl_cfgp2p.h +++ b/drivers/net/wireless/bcmdhd/wl_cfgp2p.h @@ -111,7 +111,7 @@ enum wl_cfgp2p_status { &(wl)->p2p->status)) #define p2p_on(wl) ((wl)->p2p->on) #define p2p_scan(wl) ((wl)->p2p->scan) - +#define p2p_is_on(wl) ((wl)->p2p && (wl)->p2p->on) /* dword align allocation */ #define WLC_IOCTL_MAXLEN 8192 -- 2.34.1