diff options
-rw-r--r-- | drivers/net/wireless/bcmdhd/Makefile | 5 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/dhd.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/dhd_linux.c | 14 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/dhd_sdio.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/wl_cfg80211.c | 40 |
5 files changed, 58 insertions, 6 deletions
diff --git a/drivers/net/wireless/bcmdhd/Makefile b/drivers/net/wireless/bcmdhd/Makefile index d2e56a7..d450f99 100644 --- a/drivers/net/wireless/bcmdhd/Makefile +++ b/drivers/net/wireless/bcmdhd/Makefile @@ -39,8 +39,8 @@ ifneq ($(CONFIG_CFG80211),) bcmdhd-objs += wl_cfg80211.o wl_cfgp2p.o wl_linux_mon.o dhd_cfg80211.o DHDCFLAGS += -DWL_CFG80211 -DWL_CFG80211_STA_EVENT -DWL_ENABLE_P2P_IF DHDCFLAGS += -DWL_IFACE_COMB_NUM_CHANNELS -DHDCFLAGS += -DCUSTOM_ROAM_TRIGGER_SETTING=-65 -DHDCFLAGS += -DCUSTOM_ROAM_DELTA_SETTING=15 +DHDCFLAGS += -DCUSTOM_ROAM_TRIGGER_SETTING=-75 +DHDCFLAGS += -DCUSTOM_ROAM_DELTA_SETTING=10 DHDCFLAGS += -DCUSTOM_KEEP_ALIVE_SETTING=28000 DHDCFLAGS += -DCUSTOM_PNO_EVENT_LOCK_xTIME=7 endif @@ -67,6 +67,7 @@ DHDCFLAGS += -DCUSTOM_AMPDU_BA_WSIZE=32 DHDCFLAGS += -DPROP_TXSTATUS_VSDB DHDCFLAGS += -DCUSTOM_MAX_TXGLOM_SIZE=32 DHDCFLAGS += -DREPEAT_READFRAME +DHDCFLAGS += -DROAM_AP_ENV_DETECTION else DHDCFLAGS += -DCUSTOM_SDIO_F2_BLKSIZE=128 endif diff --git a/drivers/net/wireless/bcmdhd/dhd.h b/drivers/net/wireless/bcmdhd/dhd.h index 1c0eef4..749ff8a 100644 --- a/drivers/net/wireless/bcmdhd/dhd.h +++ b/drivers/net/wireless/bcmdhd/dhd.h @@ -317,6 +317,9 @@ typedef struct dhd_pub { #ifdef PNO_SUPPORT void *pno_state; #endif +#ifdef ROAM_AP_ENV_DETECTION + bool roam_env_detection; +#endif bool dongle_isolation; bool dongle_trap_occured; /* flag for sending HANG event to upper layer */ int hang_was_sent; diff --git a/drivers/net/wireless/bcmdhd/dhd_linux.c b/drivers/net/wireless/bcmdhd/dhd_linux.c index 98401b0..34505c6 100644 --- a/drivers/net/wireless/bcmdhd/dhd_linux.c +++ b/drivers/net/wireless/bcmdhd/dhd_linux.c @@ -3659,6 +3659,9 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) int roam_trigger[2] = {CUSTOM_ROAM_TRIGGER_SETTING, WLC_BAND_ALL}; int roam_scan_period[2] = {10, WLC_BAND_ALL}; int roam_delta[2] = {CUSTOM_ROAM_DELTA_SETTING, WLC_BAND_ALL}; +#ifdef ROAM_AP_ENV_DETECTION + int roam_env_mode = AP_ENV_INDETERMINATE; +#endif /* ROAM_AP_ENV_DETECTION */ #ifdef FULL_ROAMING_SCAN_PERIOD_60_SEC int roam_fullscan_period = 60; #else /* FULL_ROAMING_SCAN_PERIOD_60_SEC */ @@ -3875,6 +3878,17 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) bcm_mkiovar("fullroamperiod", (char *)&roam_fullscan_period, 4, iovbuf, sizeof(iovbuf)); if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) DHD_ERROR(("%s: roam fullscan period set failed %d\n", __FUNCTION__, ret)); +#ifdef ROAM_AP_ENV_DETECTION + if (roam_trigger[0] == WL_AUTO_ROAM_TRIGGER) { + bcm_mkiovar("roam_env_detection", (char *)&roam_env_mode, + 4, iovbuf, sizeof(iovbuf)); + if (dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0) == BCME_OK) + dhd->roam_env_detection = TRUE; + else { + dhd->roam_env_detection = FALSE; + } + } +#endif /* ROAM_AP_ENV_DETECTION */ #endif /* ROAM_ENABLE */ #ifdef WLTDLS diff --git a/drivers/net/wireless/bcmdhd/dhd_sdio.c b/drivers/net/wireless/bcmdhd/dhd_sdio.c index 33bfb45..6a5a224 100644 --- a/drivers/net/wireless/bcmdhd/dhd_sdio.c +++ b/drivers/net/wireless/bcmdhd/dhd_sdio.c @@ -6966,7 +6966,7 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, sd1idle = TRUE; dhd_readahead = TRUE; retrydata = FALSE; - dhd_doflow = FALSE; + dhd_doflow = TRUE; dhd_dongle_ramsize = 0; dhd_txminmax = DHD_TXMINMAX; diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/bcmdhd/wl_cfg80211.c index 9f99c81..7c62546 100644 --- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c +++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.c @@ -3093,6 +3093,9 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, wl_extjoin_params_t *ext_join_params; struct wl_join_params join_params; size_t join_params_size; +#if defined(ROAM_ENABLE) && defined(ROAM_AP_ENV_DETECTION) + dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); +#endif /* ROAM_AP_ENV_DETECTION */ s32 err = 0; wpa_ie_fixed_t *wpa_ie; bcm_tlv_t *wpa2_ie; @@ -3220,6 +3223,17 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, return err; } } +#if defined(ROAM_ENABLE) && defined(ROAM_AP_ENV_DETECTION) + if (dhd->roam_env_detection && (wldev_iovar_setint(dev, "roam_env_detection", + AP_ENV_DETECT_NOT_USED) == BCME_OK)) { + s32 roam_trigger[2] = {WL_AUTO_ROAM_TRIGGER, WLC_BAND_ALL}; + err = wldev_ioctl(dev, WLC_SET_ROAM_TRIGGER, roam_trigger, + sizeof(roam_trigger), true); + if (unlikely(err)) { + WL_ERR((" failed to restore roam_trigger for auto env detection\n")); + } + } +#endif /* ROAM_AP_ENV_DETECTION */ if (chan) { wl->channel = ieee80211_frequency_to_channel(chan->center_freq); chan_cnt = 1; @@ -3454,7 +3468,8 @@ wl_cfg80211_set_tx_power(struct wiphy *wiphy, #ifdef SUPPORT_WL_TXPOWER if (type == NL80211_TX_POWER_AUTOMATIC) txpwrqdbm = 127; - txpwrqdbm |= WL_TXPWR_OVERRIDE; + else + txpwrqdbm |= WL_TXPWR_OVERRIDE; #endif /* SUPPORT_WL_TXPOWER */ err = wldev_iovar_setint(ndev, "qtxpower", txpwrqdbm); if (unlikely(err)) { @@ -6097,6 +6112,13 @@ wl_cfg80211_stop_ap( wl_clr_drv_status(wl, AP_CREATED, dev); /* Turn on the MPC */ wldev_iovar_setint(dev, "mpc", 1); + if (wl->ap_info) { + kfree(wl->ap_info->wpa_ie); + kfree(wl->ap_info->rsn_ie); + kfree(wl->ap_info->wps_ie); + kfree(wl->ap_info); + wl->ap_info = NULL; + } } else { WL_DBG(("Stopping P2P GO \n")); } @@ -7490,6 +7512,9 @@ wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev, { struct wl_connect_info *conn_info = wl_to_conn(wl); struct wl_security *sec = wl_read_prof(wl, ndev, WL_PROF_SEC); +#if defined(ROAM_ENABLE) && defined(ROAM_AP_ENV_DETECTION) + dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); +#endif /* ROAM_AP_ENV_DETECTION */ s32 err = 0; u8 *curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); if (!sec) { @@ -7526,6 +7551,11 @@ wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev, wl_update_bss_info(wl, ndev); wl_update_pmklist(ndev, wl->pmk_list, err); wl_set_drv_status(wl, CONNECTED, ndev); +#if defined(ROAM_ENABLE) && defined(ROAM_AP_ENV_DETECTION) + if (dhd->roam_env_detection) + wldev_iovar_setint(ndev, "roam_env_detection", + AP_ENV_INDETERMINATE); +#endif /* ROAM_AP_ENV_DETECTION */ if (ndev != wl_to_prmry_ndev(wl)) { /* reinitialize completion to clear previous count */ INIT_COMPLETION(wl->iface_disable); @@ -10573,8 +10603,12 @@ s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len, s32 pktflag = 0; wl = wlcfg_drv_priv; - if (wl_get_drv_status(wl, AP_CREATING, net) || - wl_get_drv_status(wl, AP_CREATED, net)) { + if (wl_get_drv_status(wl, AP_CREATING, net)) { + /* Vendor IEs should be set to FW + * after SoftAP interface is brought up + */ + goto exit; + } else if (wl_get_drv_status(wl, AP_CREATED, net)) { ndev = net; bssidx = 0; } else if (wl->p2p) { |