diff options
author | Syed Asifful Dayyan Rafiuddeen <syedd@broadcom.com> | 2013-12-04 09:58:11 +0530 |
---|---|---|
committer | Mandar Padmawar <mpadmawar@nvidia.com> | 2014-02-11 02:58:16 -0800 |
commit | 1282e9ee337d735b3c66425230d48ebb8c6573a5 (patch) | |
tree | 5deb070aad8412cd45ba13f10dfeb55b99481d86 /drivers | |
parent | 428976d28daa3c72a0d15472d9183fd178f57d1a (diff) |
net: wireless: bcmdhd: update driver to version 1.88.58
Change list:
-Enable TDLS for Nvidia.
-RB:21080 JIRA:SWWLAN-41226 CSP:671392 Mobile Hotspot throughput performance is low
-RB:20909 JIRA:SWWLAN-41211 Preventing a memory leakage
-RB:20818 [Android-Kitkat] Change the logic which controls TDLS connection in Kitkat MR1 framework
-RB:20877 [Android-kitkat] enable ipv6 router advertisement packet filter mode in suspend
-RB:20654 CSP:730963 Adding AP isoloation code
-RB:20808 [Android-Kitkat] change DTIM skip policy in suspend mode of device to solve link lost issue due to beacon lost
-RB:17773 [Android-kitkat] Fixed a bug for negative padding
-RB:20628 fix about handling BSS peer information
-Fix wlu build error by r432432.
-RB:19436 CSP:724180 JIRA:SWDHD-39 Roaming trigger value is always initialized to the default when associated to new AP.
-RB:19729 [Android-Kitkat] Fixed the corner case of PNO issue
-RB:13157 JIRA:SWDHD-39 Fix windows dongle driver hang from r432053
-JIRA:SWDHD-47 RB:19389 Ignore Power Save mode for AIBSS
-RB:19106 JIRA:SWWLAN-39738 Fix compile err for r432982
-RB:19246 Fixing bugs about handling TX fail event Fixing bugs about handling TX fail event
-RB:19106 JIRA:SWWLAN-39738 Refactoring sdiofifo overrun/underrun tuning code
-RB:19163 [Android-Kitkat] Fixed country code setting issue on Nexus-5
-RB:19162 [Android-Kitkat] Fixed corner case of P2P issue in Google Nexus-5
Bug 1397433
Change-Id: I4675f91b512bcd8bd49a384b28a864c106fe372f
Signed-off-by: Syed Asifful Dayyan Rafiuddeen <syedd@broadcom.com>
Signed-off-by: Om Prakash Singh <omp@nvidia.com>
Reviewed-on: http://git-master/r/364087
Reviewed-by: Narayan Reddy <narayanr@nvidia.com>
Tested-by: Narayan Reddy <narayanr@nvidia.com>
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/bcmdhd/Makefile | 4 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c | 3 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/bcmutils.c | 2 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/dhd.h | 14 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/dhd_cdc.c | 2 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/dhd_common.c | 29 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/dhd_linux.c | 149 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/dhd_pno.c | 28 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/dhd_sdio.c | 114 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/bcmutils.h | 4 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/epivers.h | 14 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/proto/ethernet.h | 4 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/wlioctl.h | 4 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/siutils.c | 2 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/wl_android.c | 2 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/wl_cfg80211.c | 57 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/wldev_common.c | 2 |
17 files changed, 309 insertions, 125 deletions
diff --git a/drivers/net/wireless/bcmdhd/Makefile b/drivers/net/wireless/bcmdhd/Makefile index 7127f03663ad..24e319e9001e 100644 --- a/drivers/net/wireless/bcmdhd/Makefile +++ b/drivers/net/wireless/bcmdhd/Makefile @@ -8,7 +8,7 @@ DHDCFLAGS = -Wall -Wstrict-prototypes -Dlinux -DBCMDRIVER \ -DMMC_SDIO_ABORT -DBCMSDIO -DBCMLXSDMMC -DBCMPLATFORM_BUS -DWLP2P \ -DWIFI_ACT_FRAME -DARP_OFFLOAD_SUPPORT \ -DKEEP_ALIVE -DGET_CUSTOM_MAC_ENABLE -DPKT_FILTER_SUPPORT \ - -DEMBEDDED_PLATFORM -DPNO_SUPPORT \ + -DEMBEDDED_PLATFORM -DPNO_SUPPORT -DWLTDLS \ -DDHD_USE_IDLECOUNT -DSET_RANDOM_MAC_SOFTAP -DROAM_ENABLE -DVSDB \ -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST \ -DESCAN_RESULT_PATCH -DHT40_GO -DPASS_ARP_PACKET \ @@ -55,7 +55,7 @@ endif ifeq ($(CONFIG_BCMDHD),y) DHDCFLAGS += -DBCM43241_CHIP - DHDCFLAGS += -DSDIO_CRC_ERROR_FIX + DHDCFLAGS += -DUSE_SDIOFIFO_IOVAR DHDCFLAGS += -DCUSTOM_SDIO_F2_BLKSIZE=128 DHDCFLAGS += -DCUSTOM_ROAM_TRIGGER_SETTING=-65 DHDCFLAGS += -DCUSTOM_ROAM_DELTA_SETTING=15 diff --git a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c index 1f9c08b0b4fb..bb56b0eeeb7a 100755 --- a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c +++ b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.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: bcmsdh_sdmmc.c 427054 2013-10-02 03:38:35Z $ + * $Id: bcmsdh_sdmmc.c 439169 2013-11-25 23:36:15Z $ */ #include <typedefs.h> @@ -1267,6 +1267,7 @@ txglomfail: return SDIOH_API_RC_FAIL; } } + pkt_len += pad; } } diff --git a/drivers/net/wireless/bcmdhd/bcmutils.c b/drivers/net/wireless/bcmdhd/bcmutils.c index a991b0cfc59b..aa5971476290 100755 --- a/drivers/net/wireless/bcmdhd/bcmutils.c +++ b/drivers/net/wireless/bcmdhd/bcmutils.c @@ -2303,7 +2303,7 @@ bcm_uint64_divide(uint32* r, uint32 a_high, uint32 a_low, uint32 b) *r = r0; } -#ifndef setbit /* As in the header file */ +#ifndef setbit /* As in the header file */ #ifdef BCMUTILS_BIT_MACROS_USE_FUNCS /* Set bit in byte array. */ void diff --git a/drivers/net/wireless/bcmdhd/dhd.h b/drivers/net/wireless/bcmdhd/dhd.h index 766978f02033..20ad570ffd07 100755 --- 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 432432 2013-10-28 15:52:47Z $ + * $Id: dhd.h 439234 2013-11-26 02:04:53Z $ */ /**************** @@ -417,6 +417,7 @@ extern int dhd_os_wake_unlock(dhd_pub_t *pub); extern int dhd_os_wake_lock_timeout(dhd_pub_t *pub); extern int dhd_os_wake_lock_rx_timeout_enable(dhd_pub_t *pub, int val); extern int dhd_os_wake_lock_ctrl_timeout_enable(dhd_pub_t *pub, int val); +extern int dhd_os_wake_lock_ctrl_timeout_cancel(dhd_pub_t *pub); extern int dhd_os_wd_wake_lock(dhd_pub_t *pub); extern int dhd_os_wd_wake_unlock(dhd_pub_t *pub); @@ -450,6 +451,8 @@ inline static void MUTEX_UNLOCK_SOFTAP_SET(dhd_pub_t * dhdp) dhd_os_wake_lock_rx_timeout_enable(pub, val) #define DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_ENABLE(pub, val) \ dhd_os_wake_lock_ctrl_timeout_enable(pub, val) +#define DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_CANCEL(pub) \ + dhd_os_wake_lock_ctrl_timeout_cancel(pub) #define DHD_PACKET_TIMEOUT_MS 1000 #define DHD_EVENT_TIMEOUT_MS 1500 @@ -801,8 +804,11 @@ extern uint dhd_force_tx_queueing; #endif /* WLTDLS */ -#define MAX_DTIM_SKIP_BEACON_ITERVAL 100 /* max allowed associated AP beacon for dtim skip */ - +#define MAX_DTIM_SKIP_BEACON_INTERVAL 100 /* max allowed associated AP beacon for DTIM skip */ +#ifndef MAX_DTIM_ALLOWED_INTERVAL +#define MAX_DTIM_ALLOWED_INTERVAL 600 /* max allowed total beacon interval for DTIM skip */ +#endif +#define NO_DTIM_SKIP 1 #ifdef SDTEST /* Echo packet generator (SDIO), pkts/s */ extern uint dhd_pktgen; @@ -1001,7 +1007,7 @@ int dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen, int idx) void dhd_arp_offload_add_ip(dhd_pub_t *dhd, uint32 ipaddr, int idx); #endif /* ARP_OFFLOAD_SUPPORT */ #ifdef WLTDLS -int dhd_tdls_enable_disable(dhd_pub_t *dhd, bool flag); +int dhd_tdls_enable(struct net_device *dev, bool tdls_on, bool auto_on, struct ether_addr *mac); #endif /* Neighbor Discovery Offload Support */ int dhd_ndo_enable(dhd_pub_t * dhd, int ndo_enable); diff --git a/drivers/net/wireless/bcmdhd/dhd_cdc.c b/drivers/net/wireless/bcmdhd/dhd_cdc.c index 056175c908b5..abe98196def7 100755 --- a/drivers/net/wireless/bcmdhd/dhd_cdc.c +++ b/drivers/net/wireless/bcmdhd/dhd_cdc.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_cdc.c 424024 2013-09-15 14:00:46Z $ + * $Id: dhd_cdc.c 434146 2013-11-05 13:06:16Z $ * * 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 diff --git a/drivers/net/wireless/bcmdhd/dhd_common.c b/drivers/net/wireless/bcmdhd/dhd_common.c index 62c924c9cdaa..84519c38ec0a 100755 --- 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 419132 2013-08-19 21:33:05Z $ + * $Id: dhd_common.c 439201 2013-11-26 00:31:53Z $ */ #include <typedefs.h> #include <osl.h> @@ -1886,9 +1886,9 @@ dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd) { int bcn_li_dtim = 1; /* deafult no dtim skip setting */ int ret = -1; - int dtim_assoc = 0; + int dtim_period = 0; int ap_beacon = 0; - + int allowed_skip_dtim_cnt = 0; /* Check if associated */ if (dhd_is_associated(dhd, NULL, NULL) == FALSE) { DHD_TRACE(("%s NOT assoc ret %d\n", __FUNCTION__, ret)); @@ -1903,20 +1903,20 @@ dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd) } /* if associated APs Beacon more that 100msec do no dtim skip */ - if (ap_beacon > MAX_DTIM_SKIP_BEACON_ITERVAL) { + if (ap_beacon > MAX_DTIM_SKIP_BEACON_INTERVAL) { DHD_ERROR(("%s NO dtim skip for AP with beacon %d ms\n", __FUNCTION__, ap_beacon)); goto exit; } /* read associated ap's dtim setup */ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_DTIMPRD, - &dtim_assoc, sizeof(dtim_assoc), FALSE, 0)) < 0) { + &dtim_period, sizeof(dtim_period), FALSE, 0)) < 0) { DHD_ERROR(("%s failed code %d\n", __FUNCTION__, ret)); goto exit; } /* if not assocated just eixt */ - if (dtim_assoc == 0) { + if (dtim_period == 0) { goto exit; } @@ -1924,22 +1924,27 @@ dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd) bcn_li_dtim = dhd->suspend_bcn_li_dtim; /* check if sta listen interval fits into AP dtim */ - if (dtim_assoc > CUSTOM_LISTEN_INTERVAL) { + if (dtim_period > CUSTOM_LISTEN_INTERVAL) { /* AP DTIM to big for our Listen Interval : no dtim skiping */ - bcn_li_dtim = 1; + bcn_li_dtim = NO_DTIM_SKIP; DHD_ERROR(("%s DTIM=%d > Listen=%d : too big ...\n", - __FUNCTION__, dtim_assoc, CUSTOM_LISTEN_INTERVAL)); + __FUNCTION__, dtim_period, CUSTOM_LISTEN_INTERVAL)); goto exit; } - if ((bcn_li_dtim * dtim_assoc) > CUSTOM_LISTEN_INTERVAL) { + if ((dtim_period * ap_beacon * bcn_li_dtim) > MAX_DTIM_ALLOWED_INTERVAL) { + allowed_skip_dtim_cnt = MAX_DTIM_ALLOWED_INTERVAL / (dtim_period * ap_beacon); + bcn_li_dtim = (allowed_skip_dtim_cnt != 0) ? allowed_skip_dtim_cnt : NO_DTIM_SKIP; + } + + if ((bcn_li_dtim * dtim_period) > CUSTOM_LISTEN_INTERVAL) { /* Round up dtim_skip to fit into STAs Listen Interval */ - bcn_li_dtim = (int)(CUSTOM_LISTEN_INTERVAL / dtim_assoc); + bcn_li_dtim = (int)(CUSTOM_LISTEN_INTERVAL / dtim_period); DHD_TRACE(("%s agjust dtim_skip as %d\n", __FUNCTION__, bcn_li_dtim)); } DHD_ERROR(("%s beacon=%d bcn_li_dtim=%d DTIM=%d Listen=%d\n", - __FUNCTION__, ap_beacon, bcn_li_dtim, dtim_assoc, CUSTOM_LISTEN_INTERVAL)); + __FUNCTION__, ap_beacon, bcn_li_dtim, dtim_period, CUSTOM_LISTEN_INTERVAL)); exit: return bcn_li_dtim; diff --git a/drivers/net/wireless/bcmdhd/dhd_linux.c b/drivers/net/wireless/bcmdhd/dhd_linux.c index 83d7bb3879f6..052e041ee68e 100755 --- 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 432432 2013-10-28 15:52:47Z $ + * $Id: dhd_linux.c 440335 2013-12-02 09:33:45Z $ */ #include <typedefs.h> @@ -218,6 +218,17 @@ extern int dhd_write_macaddr(struct ether_addr *mac); #else static inline int dhd_write_macaddr(struct ether_addr *mac) { return 0; } #endif + +#ifdef CUSTOMER_HW10 +extern int dhd_preinit_config(dhd_pub_t *dhd, int ifidx); +#endif /* CUSTOMER_HW10 */ + + +#if defined(SOFTAP_TPUT_ENHANCE) +extern void dhd_bus_setidletime(dhd_pub_t *dhdp, int idle_time); +extern void dhd_bus_getidletime(dhd_pub_t *dhdp, int* idle_time); +#endif /* SOFTAP_TPUT_ENHANCE */ + struct ipv6_addr { char ipv6_addr[IPV6_ADDR_LEN]; dhd_ipv6_op_t ipv6_oper; @@ -934,6 +945,8 @@ static int dhd_set_suspend(int value, dhd_pub_t *dhd) #ifndef ENABLE_FW_ROAM_SUSPEND uint roamvar = 1; #endif /* ENABLE_FW_ROAM_SUSPEND */ + uint nd_ra_filter = 0; + int ret = 0; if (!dhd) return -ENODEV; @@ -976,6 +989,16 @@ static int dhd_set_suspend(int value, dhd_pub_t *dhd) iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif /* ENABLE_FW_ROAM_SUSPEND */ + if (FW_SUPPORTED(dhd, ndoe)) { + /* enable IPv6 RA filter in firmware during suspend */ + nd_ra_filter = 1; + bcm_mkiovar("nd_ra_filter_enable", (char *)&nd_ra_filter, 4, + iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) + DHD_ERROR(("failed to set nd_ra_filter (%d)\n", + ret)); + } } else { #ifdef PKT_FILTER_SUPPORT dhd->early_suspended = 0; @@ -1004,6 +1027,16 @@ static int dhd_set_suspend(int value, dhd_pub_t *dhd) sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif /* ENABLE_FW_ROAM_SUSPEND */ + if (FW_SUPPORTED(dhd, ndoe)) { + /* disable IPv6 RA filter in firmware during suspend */ + nd_ra_filter = 0; + bcm_mkiovar("nd_ra_filter_enable", (char *)&nd_ra_filter, 4, + iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) + DHD_ERROR(("failed to set nd_ra_filter (%d)\n", + ret)); + } } } dhd_suspend_unlock(dhd); @@ -3753,43 +3786,73 @@ dhd_bus_start(dhd_pub_t *dhdp) return 0; } #ifdef WLTDLS -int dhd_tdls_enable_disable(dhd_pub_t *dhd, bool flag) +int _dhd_tdls_enable(dhd_pub_t *dhd, bool tdls_on, bool auto_on, struct ether_addr *mac) { char iovbuf[WLC_IOCTL_SMLEN]; - uint32 tdls = flag; - int ret; -#ifdef WLTDLS_AUTO_ENABLE - uint32 tdls_auto_op = 1; + uint32 tdls = tdls_on; + int ret = 0; + uint32 tdls_auto_op = 0; uint32 tdls_idle_time = CUSTOM_TDLS_IDLE_MODE_SETTING; -#endif /* WLTDLS_AUTO_ENABLE */ + int32 tdls_rssi_high = CUSTOM_TDLS_RSSI_THRESHOLD_HIGH; + int32 tdls_rssi_low = CUSTOM_TDLS_RSSI_THRESHOLD_LOW; + BCM_REFERENCE(mac); if (!FW_SUPPORTED(dhd, tdls)) return BCME_ERROR; + if (dhd->tdls_enable == tdls_on) + goto auto_mode; bcm_mkiovar("tdls_enable", (char *)&tdls, sizeof(tdls), iovbuf, sizeof(iovbuf)); if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { DHD_ERROR(("%s: tdls %d failed %d\n", __FUNCTION__, tdls, ret)); goto exit; } - dhd->tdls_enable = flag; - if (!flag) - goto exit; -#ifdef WLTDLS_AUTO_ENABLE + dhd->tdls_enable = tdls_on; +auto_mode: + + tdls_auto_op = auto_on; bcm_mkiovar("tdls_auto_op", (char *)&tdls_auto_op, sizeof(tdls_auto_op), iovbuf, sizeof(iovbuf)); - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) { DHD_ERROR(("%s: tdls_auto_op failed %d\n", __FUNCTION__, ret)); goto exit; } - bcm_mkiovar("tdls_idle_time", (char *)&tdls_idle_time, sizeof(tdls_idle_time), - iovbuf, sizeof(iovbuf)); - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { - DHD_ERROR(("%s: tdls_idle_time failed %d\n", __FUNCTION__, ret)); - goto exit; + + if (tdls_auto_op) { + bcm_mkiovar("tdls_idle_time", (char *)&tdls_idle_time, + sizeof(tdls_idle_time), iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s: tdls_idle_time failed %d\n", __FUNCTION__, ret)); + goto exit; + } + bcm_mkiovar("tdls_rssi_high", (char *)&tdls_rssi_high, 4, iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s: tdls_rssi_high failed %d\n", __FUNCTION__, ret)); + goto exit; + } + bcm_mkiovar("tdls_rssi_low", (char *)&tdls_rssi_low, 4, iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s: tdls_rssi_low failed %d\n", __FUNCTION__, ret)); + goto exit; + } } -#endif /* WLTDLS_AUTO_ENABLE */ + exit: return ret; } +int dhd_tdls_enable(struct net_device *dev, bool tdls_on, bool auto_on, struct ether_addr *mac) +{ + dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); + int ret = 0; + if (dhd) + ret = _dhd_tdls_enable(&dhd->pub, tdls_on, auto_on, mac); + else + ret = BCME_ERROR; + return ret; +} #endif /* WLTDLS */ bool dhd_is_concurrent_mode(dhd_pub_t *dhd) @@ -3950,6 +4013,9 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #ifdef PKT_FILTER_SUPPORT dhd_pkt_filter_enable = TRUE; #endif +#ifdef WLTDLS + dhd->tdls_enable = FALSE; +#endif /* WLTDLS */ dhd->suspend_bcn_li_dtim = CUSTOM_SUSPEND_BCN_LI_DTIM; DHD_TRACE(("Enter %s\n", __FUNCTION__)); dhd->op_mode = 0; @@ -4123,9 +4189,11 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #endif /* ROAM_ENABLE */ #ifdef WLTDLS - dhd_tdls_enable_disable(dhd, 1); + /* by default TDLS on and auto mode off */ + _dhd_tdls_enable(dhd, true, false, NULL); #endif /* WLTDLS */ + #ifdef DHD_ENABLE_LPC /* Set lpc 1 */ bcm_mkiovar("lpc", (char *)&lpc, 4, iovbuf, sizeof(iovbuf)); @@ -4370,6 +4438,32 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) +#if defined(CUSTOMER_HW10) + dhd_preinit_config(dhd, 0); +#endif /* CUSTOMER_HW10 */ + +#if defined(SOFTAP_TPUT_ENHANCE) + if (dhd->op_mode & DHD_FLAG_HOSTAP_MODE) { + dhd_bus_setidletime(dhd, (int)100); + dhd_use_tcpack_suppress = FALSE; + memset(buf, 0, sizeof(buf)); + bcm_mkiovar("bus:txglom_auto_control", 0, 0, buf, sizeof(buf)); + + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, sizeof(buf), FALSE, 0)) < 0) { + glom = 0; + bcm_mkiovar("bus:txglom", (char *)&glom, 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + } + else { + if (buf[0] == 0) { + glom = 1; + bcm_mkiovar("bus:txglom_auto_control", (char *)&glom, 4, iovbuf, + sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + } + } +} +#endif /* SOFTAP_TPUT_ENHANCE */ /* query for 'ver' to get version info from firmware */ memset(buf, 0, sizeof(buf)); ptr = buf; @@ -6130,6 +6224,23 @@ int dhd_os_wake_lock_ctrl_timeout_enable(dhd_pub_t *pub, int val) return 0; } +int dhd_os_wake_lock_ctrl_timeout_cancel(dhd_pub_t *pub) +{ + dhd_info_t *dhd = (dhd_info_t *)(pub->info); + unsigned long flags; + + if (dhd) { + spin_lock_irqsave(&dhd->wakelock_spinlock, flags); + dhd->wakelock_ctrl_timeout_enable = 0; +#ifdef CONFIG_HAS_WAKELOCK + if (wake_lock_active(&dhd->wl_ctrlwake)) + wake_unlock(&dhd->wl_ctrlwake); +#endif + spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); + } + return 0; +} + int net_os_wake_lock_rx_timeout_enable(struct net_device *dev, int val) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); diff --git a/drivers/net/wireless/bcmdhd/dhd_pno.c b/drivers/net/wireless/bcmdhd/dhd_pno.c index 165df802e41d..3696a83544ca 100755 --- a/drivers/net/wireless/bcmdhd/dhd_pno.c +++ b/drivers/net/wireless/bcmdhd/dhd_pno.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_pno.c 427050 2013-10-02 03:31:11Z $ + * $Id: dhd_pno.c 435029 2013-11-08 02:47:59Z $ */ #include <typedefs.h> #include <osl.h> @@ -91,6 +91,7 @@ is_dfs(uint16 channel) else return FALSE; } + int dhd_pno_clean(dhd_pub_t *dhd) { @@ -301,13 +302,13 @@ _dhd_pno_set(dhd_pub_t *dhd, const dhd_pno_params_t *pno_params, dhd_pno_mode_t /* set bestn to calculate the max mscan which firmware supports */ err = dhd_iovar(dhd, 0, "pfnmem", (char *)&_tmp, sizeof(_tmp), 1); if (err < 0) { - DHD_ERROR(("%s : failed to set pfnmscan\n", __FUNCTION__)); + DHD_ERROR(("%s : failed to set pfnmem\n", __FUNCTION__)); goto exit; } /* get max mscan which the firmware supports */ err = dhd_iovar(dhd, 0, "pfnmem", (char *)&_tmp, sizeof(_tmp), 0); if (err < 0) { - DHD_ERROR(("%s : failed to get pfnmscan\n", __FUNCTION__)); + DHD_ERROR(("%s : failed to get pfnmem\n", __FUNCTION__)); goto exit; } DHD_PNO((" returned mscan : %d, set bestn : %d\n", _tmp, pfn_param.bestn)); @@ -856,15 +857,23 @@ dhd_pno_set_for_ssid(dhd_pub_t *dhd, wlc_ssid_t* ssid_list, int nssid, scan_fr, pno_repeat, pno_freq_expo_max, nchan)); _params = &(_pno_state->pno_params_arr[INDEX_OF_LEGACY_PARAMS]); - if (!(_pno_state->pno_mode & DHD_PNO_LEGACY_MODE)) { - _pno_state->pno_mode |= DHD_PNO_LEGACY_MODE; - err = _dhd_pno_reinitialize_prof(dhd, _params, DHD_PNO_LEGACY_MODE); + if (_pno_state->pno_mode & DHD_PNO_LEGACY_MODE) { + DHD_ERROR(("%s : Legacy PNO mode was already started, " + "will disable previous one to start new one\n", __FUNCTION__)); + err = dhd_pno_stop_for_ssid(dhd); if (err < 0) { - DHD_ERROR(("%s : failed to reinitialize profile (err %d)\n", + DHD_ERROR(("%s : failed to stop legacy PNO (err %d)\n", __FUNCTION__, err)); goto exit; } } + _pno_state->pno_mode |= DHD_PNO_LEGACY_MODE; + err = _dhd_pno_reinitialize_prof(dhd, _params, DHD_PNO_LEGACY_MODE); + if (err < 0) { + DHD_ERROR(("%s : failed to reinitialize profile (err %d)\n", + __FUNCTION__, err)); + goto exit; + } memset(_chan_list, 0, sizeof(_chan_list)); tot_nchan = nchan; if (tot_nchan > 0 && channel_list) { @@ -929,7 +938,7 @@ dhd_pno_set_for_ssid(dhd_pub_t *dhd, wlc_ssid_t* ssid_list, int nssid, goto exit; } if ((err = _dhd_pno_add_ssid(dhd, ssid_list, nssid)) < 0) { - DHD_ERROR(("failed to add ssid list (err %d) in firmware\n", err)); + DHD_ERROR(("failed to add ssid list(err %d), %d in firmware\n", err, nssid)); goto exit; } for (i = 0; i < nssid; i++) { @@ -996,6 +1005,9 @@ dhd_pno_set_for_batch(dhd_pub_t *dhd, struct dhd_pno_batch_params *batch_params) __FUNCTION__)); goto exit; } + } else { + /* batch mode is already started */ + return -EBUSY; } _params->params_batch.scan_fr = batch_params->scan_fr; _params->params_batch.bestn = batch_params->bestn; diff --git a/drivers/net/wireless/bcmdhd/dhd_sdio.c b/drivers/net/wireless/bcmdhd/dhd_sdio.c index f9de6efaca75..ec44acdf098f 100755 --- 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 426658 2013-09-30 12:14:01Z $ + * $Id: dhd_sdio.c 440335 2013-12-02 09:33:45Z $ */ #include <typedefs.h> @@ -418,13 +418,8 @@ static bool sd1idle; static bool retrydata; #define RETRYCHAN(chan) (((chan) == SDPCM_EVENT_CHANNEL) || retrydata) -#if defined(SDIO_CRC_ERROR_FIX) -static uint watermark = 48; -static uint mesbusyctrl = 80; -#else -static const uint watermark = 8; -static const uint mesbusyctrl = 0; -#endif +static uint watermark = 8; +static uint mesbusyctrl = 0; static const uint firstread = DHD_FIRSTREAD; #define HDATLEN (firstread - (SDPCM_HDRLEN)) @@ -602,31 +597,42 @@ extern uint32 dhd_get_htsf(void *dhd, int ifidx); #endif /* WLMEDIA_HTSF */ static void -dhd_overflow_war(struct dhd_bus *bus) +dhdsdio_tune_fifoparam(struct dhd_bus *bus) { int err; uint8 devctl, wm, mes; - /* See .ppt in PR for these recommended values */ - if (bus->blocksize == 512) { - wm = OVERFLOW_BLKSZ512_WM; - mes = OVERFLOW_BLKSZ512_MES; + if (bus->sih->buscorerev >= 15) { + /* See .ppt in PR for these recommended values */ + if (bus->blocksize == 512) { + wm = OVERFLOW_BLKSZ512_WM; + mes = OVERFLOW_BLKSZ512_MES; + } else { + mes = bus->blocksize/4; + wm = bus->blocksize/4; + } + watermark = wm; + mesbusyctrl = mes; } else { - mes = bus->blocksize/4; - wm = bus->blocksize/4; + DHD_INFO(("skip fifotune: SdioRev(%d) is lower than minimal requested ver\n", + bus->sih->buscorerev)); + return; } - /* Update watermark */ - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_WATERMARK, wm, &err); + if (wm > 0) { + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_WATERMARK, wm, &err); - devctl = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, &err); - devctl |= SBSDIO_DEVCTL_F2WM_ENAB; - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, devctl, &err); + devctl = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, &err); + devctl |= SBSDIO_DEVCTL_F2WM_ENAB; + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, devctl, &err); + } /* Update MES */ - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_MESBUSYCTRL, - (mes | SBSDIO_MESBUSYCTRL_ENAB), &err); + if (mes > 0) { + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_MESBUSYCTRL, + (mes | SBSDIO_MESBUSYCTRL_ENAB), &err); + } DHD_INFO(("Apply overflow WAR: 0x%02x 0x%02x 0x%02x\n", bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, &err), @@ -2717,10 +2723,10 @@ enum { IOV_SDALIGN, IOV_DEVRESET, IOV_CPU, -#if defined(SDIO_CRC_ERROR_FIX) +#if defined(USE_SDIOFIFO_IOVAR) IOV_WATERMARK, IOV_MESBUSYCTRL, -#endif /* SDIO_CRC_ERROR_FIX */ +#endif /* USE_SDIOFIFO_IOVAR */ #ifdef SDTEST IOV_PKTGEN, IOV_EXTLOOP, @@ -2783,10 +2789,10 @@ const bcm_iovar_t dhdsdio_iovars[] = { {"extloop", IOV_EXTLOOP, 0, IOVT_BOOL, 0 }, {"pktgen", IOV_PKTGEN, 0, IOVT_BUFFER, sizeof(dhd_pktgen_t) }, #endif /* SDTEST */ -#if defined(SDIO_CRC_ERROR_FIX) +#if defined(USE_SDIOFIFO_IOVAR) {"watermark", IOV_WATERMARK, 0, IOVT_UINT32, 0 }, {"mesbusyctrl", IOV_MESBUSYCTRL, 0, IOVT_UINT32, 0 }, -#endif /* SDIO_CRC_ERROR_FIX */ +#endif /* USE_SDIOFIFO_IOVAR */ {"devcap", IOV_DEVCAP, 0, IOVT_UINT32, 0 }, {"dngl_isolation", IOV_DONGLEISOLATION, 0, IOVT_UINT32, 0 }, {"kso", IOV_KSO, 0, IOVT_UINT32, 0 }, @@ -3915,7 +3921,7 @@ dhdsdio_doiovar(dhd_bus_t *bus, const bcm_iovar_t *vi, uint32 actionid, const ch break; #endif /* SDTEST */ -#if defined(SDIO_CRC_ERROR_FIX) +#if defined(USE_SDIOFIFO_IOVAR) case IOV_GVAL(IOV_WATERMARK): int_val = (int32)watermark; bcopy(&int_val, arg, val_size); @@ -3941,7 +3947,7 @@ dhdsdio_doiovar(dhd_bus_t *bus, const bcm_iovar_t *vi, uint32 actionid, const ch bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_MESBUSYCTRL, ((uint8)mesbusyctrl | 0x80), NULL); break; -#endif /* SDIO_CRC_ERROR_FIX */ +#endif case IOV_GVAL(IOV_DONGLEISOLATION): @@ -4403,10 +4409,7 @@ dhd_bus_iovar_op(dhd_pub_t *dhdp, const char *name, } else { DHD_INFO(("%s: noted %s update, value now %d\n", __FUNCTION__, "sd_blocksize", bus->blocksize)); - - if ((bus->sih->chip == BCM4335_CHIP_ID) || - (bus->sih->chip == BCM4339_CHIP_ID)) - dhd_overflow_war(bus); + dhdsdio_tune_fifoparam(bus); } } bus->roundup = MIN(max_roundup, bus->blocksize); @@ -4641,22 +4644,11 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) bus->hostintmask |= I_XMTDATA_AVAIL; } W_SDREG(bus->hostintmask, &bus->regs->hostintmask, retries); -#ifdef SDIO_CRC_ERROR_FIX - if (bus->blocksize < 512) { - mesbusyctrl = watermark = bus->blocksize / 4; - } -#endif /* SDIO_CRC_ERROR_FIX */ - if (!((bus->sih->chip == BCM4335_CHIP_ID) || - (bus->sih->chip == BCM4339_CHIP_ID))) { + + if (bus->sih->buscorerev < 15) { bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_WATERMARK, (uint8)watermark, &err); } -#ifdef SDIO_CRC_ERROR_FIX - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_MESBUSYCTRL, - (uint8)mesbusyctrl|0x80, &err); - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, - SBSDIO_DEVCTL_EN_F2_BLK_WATERMARK, NULL); -#endif /* SDIO_CRC_ERROR_FIX */ /* Set bus state according to enable result */ dhdp->busstate = DHD_BUS_DATA; @@ -7412,10 +7404,7 @@ dhdsdio_probe_init(dhd_bus_t *bus, osl_t *osh, void *sdh) } else { DHD_INFO(("%s: Initial value for %s is %d\n", __FUNCTION__, "sd_blocksize", bus->blocksize)); - - if ((bus->sih->chip == BCM4335_CHIP_ID) || - (bus->sih->chip == BCM4339_CHIP_ID)) - dhd_overflow_war(bus); + dhdsdio_tune_fifoparam(bus); } bus->roundup = MIN(max_roundup, bus->blocksize); @@ -8297,3 +8286,30 @@ dhd_get_chipid(dhd_pub_t *dhd) else return 0; } + +#if defined(SOFTAP_TPUT_ENHANCE) +void dhd_bus_setidletime(dhd_pub_t *dhdp, int idle_time) +{ + if (!dhdp || !dhdp->bus) { + DHD_ERROR(("%s:Bus is Invalid\n", __FUNCTION__)); + return; + } + + dhdp->bus->idletime = idle_time; +} + +void dhd_bus_getidletime(dhd_pub_t *dhdp, int* idle_time) +{ + if (!dhdp || !dhdp->bus) { + DHD_ERROR(("%s:Bus is Invalid\n", __FUNCTION__)); + return; + } + + if (!idle_time) { + DHD_ERROR(("%s:Arg idle_time is NULL\n", __FUNCTION__)); + return; + } + + *idle_time = dhdp->bus->idletime; +} +#endif /* SOFTAP_TPUT_ENHANCE */ diff --git a/drivers/net/wireless/bcmdhd/include/bcmutils.h b/drivers/net/wireless/bcmdhd/include/bcmutils.h index b26a1b9d65e9..7d742cd5224b 100755 --- a/drivers/net/wireless/bcmdhd/include/bcmutils.h +++ b/drivers/net/wireless/bcmdhd/include/bcmutils.h @@ -666,7 +666,7 @@ extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len); #define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0])) #endif -#ifndef ARRAYLAST /* returns pointer to last array element */ +#ifndef ARRAYLAST /* returns pointer to last array element */ #define ARRAYLAST(a) (&a[ARRAYSIZE(a)-1]) #endif @@ -676,7 +676,7 @@ extern void *_bcmutils_dummy_fn; /* bit map related macros */ #ifndef setbit -#ifndef NBBY /* the BSD family defines NBBY */ +#ifndef NBBY /* the BSD family defines NBBY */ #define NBBY 8 /* 8 bits per byte */ #endif /* #ifndef NBBY */ #ifdef BCMUTILS_BIT_MACROS_USE_FUNCS diff --git a/drivers/net/wireless/bcmdhd/include/epivers.h b/drivers/net/wireless/bcmdhd/include/epivers.h index 0a0e889dbdac..36682881025e 100755 --- a/drivers/net/wireless/bcmdhd/include/epivers.h +++ b/drivers/net/wireless/bcmdhd/include/epivers.h @@ -30,26 +30,26 @@ #define EPI_MINOR_VERSION 88 -#define EPI_RC_NUMBER 55 +#define EPI_RC_NUMBER 58 #define EPI_INCREMENTAL_NUMBER 0 #define EPI_BUILD_NUMBER 0 -#define EPI_VERSION 1, 88, 55, 0 +#define EPI_VERSION 1, 88, 58, 0 -#define EPI_VERSION_NUM 0x01583700 +#define EPI_VERSION_NUM 0x01583a00 -#define EPI_VERSION_DEV 1.88.55 +#define EPI_VERSION_DEV 1.88.58 /* Driver Version String, ASCII, 32 chars max */ #ifdef BCMINTERNAL -#define EPI_VERSION_STR "1.88.55 (r BCMINT)" +#define EPI_VERSION_STR "1.88.58 (r BCMINT)" #else #ifdef WLTEST -#define EPI_VERSION_STR "1.88.55 (r WLTEST)" +#define EPI_VERSION_STR "1.88.58 (r WLTEST)" #else -#define EPI_VERSION_STR "1.88.55 (r)" +#define EPI_VERSION_STR "1.88.58 (r)" #endif #endif /* BCMINTERNAL */ diff --git a/drivers/net/wireless/bcmdhd/include/proto/ethernet.h b/drivers/net/wireless/bcmdhd/include/proto/ethernet.h index 2977c31aadc0..c594e5c87ff6 100755 --- a/drivers/net/wireless/bcmdhd/include/proto/ethernet.h +++ b/drivers/net/wireless/bcmdhd/include/proto/ethernet.h @@ -24,7 +24,7 @@ * $Id: ethernet.h 384540 2013-02-12 04:28:58Z $ */ -#ifndef _NET_ETHERNET_H_ /* use native BSD ethernet.h when available */ +#ifndef _NET_ETHERNET_H_ /* use native BSD ethernet.h when available */ #define _NET_ETHERNET_H_ #ifndef _TYPEDEFS_H_ @@ -117,7 +117,7 @@ ((uint8 *)ea)[5] = ((mgrp_ip) >> 0) & 0xff; \ } -#ifndef __INCif_etherh /* Quick and ugly hack for VxWorks */ +#ifndef __INCif_etherh /* Quick and ugly hack for VxWorks */ /* * Structure of a 10Mb/s Ethernet header. */ diff --git a/drivers/net/wireless/bcmdhd/include/wlioctl.h b/drivers/net/wireless/bcmdhd/include/wlioctl.h index 50f98790dbec..f1e4659c62b1 100755 --- a/drivers/net/wireless/bcmdhd/include/wlioctl.h +++ b/drivers/net/wireless/bcmdhd/include/wlioctl.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: wlioctl.h 432432 2013-10-28 15:52:47Z $ + * $Id: wlioctl.h 435951 2013-11-12 19:46:53Z $ */ #ifndef _wlioctl_h_ @@ -4183,7 +4183,6 @@ typedef struct wl_keep_alive_pkt { #define WL_KEEP_ALIVE_FIXED_LEN OFFSETOF(wl_keep_alive_pkt_t, data) -#ifdef PKT_FILTER_SUPPORT /* * Dongle pattern matching filter. */ @@ -4267,7 +4266,6 @@ typedef struct wl_pkt_filter_ports { #define WL_PKT_FILTER_PORTS_VERSION 0 #define WL_PKT_FILTER_PORTS_MAX 128 -#endif /* PKT_FILTER_SUPPORT */ #define RSN_KCK_LENGTH 16 #define RSN_KEK_LENGTH 16 diff --git a/drivers/net/wireless/bcmdhd/siutils.c b/drivers/net/wireless/bcmdhd/siutils.c index e0f7199b6fdc..e1112137b1ff 100755 --- a/drivers/net/wireless/bcmdhd/siutils.c +++ b/drivers/net/wireless/bcmdhd/siutils.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: siutils.c 414368 2013-07-24 15:00:23Z $ + * $Id: siutils.c 434467 2013-11-06 12:41:42Z $ */ #include <bcm_cfg.h> diff --git a/drivers/net/wireless/bcmdhd/wl_android.c b/drivers/net/wireless/bcmdhd/wl_android.c index 4a0994b28a08..0ea63fe67506 100755 --- a/drivers/net/wireless/bcmdhd/wl_android.c +++ b/drivers/net/wireless/bcmdhd/wl_android.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: wl_android.c 432432 2013-10-28 15:52:47Z $ + * $Id: wl_android.c 438523 2013-11-22 05:32:50Z $ */ #include <linux/module.h> diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/bcmdhd/wl_cfg80211.c index 34dfc4039e85..3a5cf0e2bcbd 100755 --- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c +++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.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: wl_cfg80211.c 432088 2013-10-25 15:02:04Z $ + * $Id: wl_cfg80211.c 439262 2013-11-26 05:09:18Z $ */ /* */ #include <typedefs.h> @@ -344,6 +344,9 @@ static s32 wl_notify_escan_complete(struct wl_priv *wl, static s32 wl_cfg80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev, u8 *peer, enum nl80211_tdls_operation oper); #endif +#ifdef WL_SCHED_SCAN +static int wl_cfg80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev); +#endif /* * event & event Q handlers for cfg80211 interfaces @@ -1459,6 +1462,9 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, bcm_struct_cfgdev *cfgdev) WL_ERR(("IFDEL didn't complete properly\n")); } ret = dhd_del_monitor(dev); + if (wl_get_mode_by_netdev(wl, dev) == WL_MODE_AP) { + DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_CANCEL((dhd_pub_t *)(wl->pub)); + } } } return ret; @@ -3225,6 +3231,11 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, wl_notify_escan_complete(wl, dev, true, true); } #endif +#ifdef WL_SCHED_SCAN + if (wl->sched_scan_req) { + wl_cfg80211_sched_scan_stop(wiphy, wl_to_prmry_ndev(wl)); + } +#endif #if defined(ESCAN_RESULT_PATCH) if (sme->bssid) memcpy(connect_req_bssid, sme->bssid, ETHER_ADDR_LEN); @@ -5163,6 +5174,9 @@ wl_cfg80211_change_bss(struct wiphy *wiphy, struct net_device *dev, struct bss_parameters *params) { + s32 err = 0; + s32 ap_isolate = 0; + if (params->use_cts_prot >= 0) { } @@ -5176,6 +5190,12 @@ wl_cfg80211_change_bss(struct wiphy *wiphy, } if (params->ap_isolate >= 0) { + ap_isolate = params->ap_isolate; + err = wldev_iovar_setint(dev, "ap_isolate", ap_isolate); + if (unlikely(err)) + { + WL_ERR(("set ap_isolate Error (%d)\n", err)); + } } if (params->ht_opmode >= 0) { @@ -6215,6 +6235,9 @@ wl_cfg80211_stop_ap( } } else { WL_DBG(("Stopping P2P GO \n")); + DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_ENABLE((dhd_pub_t *)(wl->pub), + DHD_EVENT_TIMEOUT_MS*3); + DHD_OS_WAKE_LOCK_TIMEOUT((dhd_pub_t *)(wl->pub)); } exit: @@ -6414,7 +6437,8 @@ fail: #define PNO_TIME 30 #define PNO_REPEAT 4 #define PNO_FREQ_EXPO_MAX 2 -int wl_cfg80211_sched_scan_start(struct wiphy *wiphy, +static int +wl_cfg80211_sched_scan_start(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_sched_scan_request *request) { @@ -6478,7 +6502,8 @@ int wl_cfg80211_sched_scan_start(struct wiphy *wiphy, return 0; } -int wl_cfg80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev) +static int +wl_cfg80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev) { struct wl_priv *wl = wiphy_priv(wiphy); @@ -8154,6 +8179,7 @@ wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, wl_clr_drv_status(wl, SCANNING, ndev); goto out_err; } + p2p_scan(wl) = false; } wl_set_drv_status(wl, SCANNING, ndev); @@ -10694,32 +10720,41 @@ wl_cfg80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev, #ifdef WLTDLS struct wl_priv *wl = wlcfg_drv_priv; tdls_iovar_t info; - dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); memset(&info, 0, sizeof(tdls_iovar_t)); if (peer) memcpy(&info.ea, peer, ETHER_ADDR_LEN); switch (oper) { case NL80211_TDLS_DISCOVERY_REQ: - if (!dhd->tdls_enable) - ret = dhd_tdls_enable_disable(dhd, 1); + /* turn on TDLS */ + ret = dhd_tdls_enable(dev, true, false, NULL); if (ret < 0) return ret; info.mode = TDLS_MANUAL_EP_DISCOVERY; break; case NL80211_TDLS_SETUP: - info.mode = TDLS_MANUAL_EP_CREATE; + /* auto mode on */ + ret = dhd_tdls_enable(dev, true, true, (struct ether_addr *)peer); + if (ret < 0) + return ret; break; case NL80211_TDLS_TEARDOWN: info.mode = TDLS_MANUAL_EP_DELETE; + /* auto mode off */ + ret = dhd_tdls_enable(dev, true, false, (struct ether_addr *)peer); + if (ret < 0) + return ret; break; default: WL_ERR(("Unsupported operation : %d\n", oper)); goto out; } - ret = wldev_iovar_setbuf(dev, "tdls_endpoint", &info, sizeof(info), - wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); - if (ret) { - WL_ERR(("tdls_endpoint error %d\n", ret)); + + if (info.mode) { + ret = wldev_iovar_setbuf(dev, "tdls_endpoint", &info, sizeof(info), + wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); + if (ret) { + WL_ERR(("tdls_endpoint error %d\n", ret)); + } } out: #endif /* WLTDLS */ diff --git a/drivers/net/wireless/bcmdhd/wldev_common.c b/drivers/net/wireless/bcmdhd/wldev_common.c index 9c678d944720..b36310d62a5b 100755 --- a/drivers/net/wireless/bcmdhd/wldev_common.c +++ b/drivers/net/wireless/bcmdhd/wldev_common.c @@ -355,7 +355,7 @@ int wldev_set_country( } if ((error < 0) || - (strncmp(country_code, cspec.ccode, WLC_CNTRY_BUF_SZ) != 0)) { + (strncmp(country_code, cspec.country_abbrev, WLC_CNTRY_BUF_SZ) != 0)) { if (user_enforced) { bzero(&scbval, sizeof(scb_val_t)); |