summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSyed Asifful Dayyan Rafiuddeen <syedd@broadcom.com>2013-12-04 09:58:11 +0530
committerMandar Padmawar <mpadmawar@nvidia.com>2014-02-11 02:58:16 -0800
commit1282e9ee337d735b3c66425230d48ebb8c6573a5 (patch)
tree5deb070aad8412cd45ba13f10dfeb55b99481d86
parent428976d28daa3c72a0d15472d9183fd178f57d1a (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>
-rw-r--r--drivers/net/wireless/bcmdhd/Makefile4
-rwxr-xr-xdrivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c3
-rwxr-xr-xdrivers/net/wireless/bcmdhd/bcmutils.c2
-rwxr-xr-xdrivers/net/wireless/bcmdhd/dhd.h14
-rwxr-xr-xdrivers/net/wireless/bcmdhd/dhd_cdc.c2
-rwxr-xr-xdrivers/net/wireless/bcmdhd/dhd_common.c29
-rwxr-xr-xdrivers/net/wireless/bcmdhd/dhd_linux.c149
-rwxr-xr-xdrivers/net/wireless/bcmdhd/dhd_pno.c28
-rwxr-xr-xdrivers/net/wireless/bcmdhd/dhd_sdio.c114
-rwxr-xr-xdrivers/net/wireless/bcmdhd/include/bcmutils.h4
-rwxr-xr-xdrivers/net/wireless/bcmdhd/include/epivers.h14
-rwxr-xr-xdrivers/net/wireless/bcmdhd/include/proto/ethernet.h4
-rwxr-xr-xdrivers/net/wireless/bcmdhd/include/wlioctl.h4
-rwxr-xr-xdrivers/net/wireless/bcmdhd/siutils.c2
-rwxr-xr-xdrivers/net/wireless/bcmdhd/wl_android.c2
-rwxr-xr-xdrivers/net/wireless/bcmdhd/wl_cfg80211.c57
-rwxr-xr-xdrivers/net/wireless/bcmdhd/wldev_common.c2
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));