summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2012-04-05 14:49:13 -0700
committerOm Prakash Singh <omp@nvidia.com>2012-06-15 14:15:16 +0530
commitf7136c9955912b104e1d2d11cc2b1ace7de7df91 (patch)
tree3b01f8b37ca2f1a8c29be6ffa819a4e8e2c64346
parent0b11bef2e7e660cc56d644f55b26843c66a9904b (diff)
net: wireless: bcmdhd: Update to version 5.90.195.53
- Add retry to wl_cfg80211_mgmt_tx() for P2P - Change singal pending return value from -512 to -110 - Minor cleaning Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
-rw-r--r--drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c4
-rw-r--r--drivers/net/wireless/bcmdhd/dhd.h6
-rw-r--r--drivers/net/wireless/bcmdhd/dhd_cdc.c2
-rw-r--r--drivers/net/wireless/bcmdhd/dhd_linux.c30
-rw-r--r--drivers/net/wireless/bcmdhd/dhd_sdio.c31
-rw-r--r--drivers/net/wireless/bcmdhd/include/bcmdevs.h1
-rw-r--r--drivers/net/wireless/bcmdhd/include/bcmsdstd.h7
-rw-r--r--drivers/net/wireless/bcmdhd/include/dhdioctl.h5
-rw-r--r--drivers/net/wireless/bcmdhd/include/epivers.h8
-rw-r--r--drivers/net/wireless/bcmdhd/wl_android.c4
-rw-r--r--drivers/net/wireless/bcmdhd/wl_cfg80211.c53
-rw-r--r--drivers/net/wireless/bcmdhd/wl_cfg80211.h4
-rw-r--r--drivers/net/wireless/bcmdhd/wl_iw.h1
13 files changed, 99 insertions, 57 deletions
diff --git a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c
index 5e28615fc5f5..1fdb7c90c84e 100644
--- a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c
+++ b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c
@@ -58,6 +58,9 @@
#if !defined(SDIO_DEVICE_ID_BROADCOM_4334)
#define SDIO_DEVICE_ID_BROADCOM_4334 0x4334
#endif /* !defined(SDIO_DEVICE_ID_BROADCOM_4334) */
+#if !defined(SDIO_DEVICE_ID_BROADCOM_4324)
+#define SDIO_DEVICE_ID_BROADCOM_4324 0x4324
+#endif /* !defined(SDIO_DEVICE_ID_BROADCOM_4324) */
#if !defined(SDIO_DEVICE_ID_BROADCOM_43239)
#define SDIO_DEVICE_ID_BROADCOM_43239 43239
#endif /* !defined(SDIO_DEVICE_ID_BROADCOM_43239) */
@@ -160,6 +163,7 @@ static const struct sdio_device_id bcmsdh_sdmmc_ids[] = {
{ SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4319) },
{ SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4330) },
{ SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4334) },
+ { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4324) },
{ SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_43239) },
{ SDIO_DEVICE_CLASS(SDIO_CLASS_NONE) },
{ /* end: all zeroes */ },
diff --git a/drivers/net/wireless/bcmdhd/dhd.h b/drivers/net/wireless/bcmdhd/dhd.h
index db5822bbb6bf..d1648b7d99cd 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 323282 2012-03-23 19:41:57Z $
+ * $Id: dhd.h 325862 2012-04-04 22:59:48Z $
*/
@@ -82,6 +82,8 @@ enum dhd_bus_state {
#define P2P_GC_ENABLED 0x0020
#define CONCURENT_MASK 0x00F0
+#define MANUFACTRING_FW "WLTEST"
+
/* max sequential rxcntl timeouts to set HANG event */
#define MAX_CNTL_TIMEOUT 2
@@ -120,7 +122,6 @@ typedef enum {
DHD_IF_DELETING
} dhd_if_state_t;
-
#if defined(CONFIG_DHD_USE_STATIC_BUF)
uint8* dhd_os_prealloc(void *osh, int section, uint size);
@@ -322,7 +323,6 @@ inline static void MUTEX_UNLOCK_SOFTAP_SET(dhd_pub_t * dhdp)
#define DHD_OS_WAKE_LOCK_TIMEOUT(pub) dhd_os_wake_lock_timeout(pub)
#define DHD_OS_WAKE_LOCK_RX_TIMEOUT_ENABLE(pub, val) 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_PACKET_TIMEOUT_MS 1000
#define DHD_EVENT_TIMEOUT_MS 1500
diff --git a/drivers/net/wireless/bcmdhd/dhd_cdc.c b/drivers/net/wireless/bcmdhd/dhd_cdc.c
index d01853c71a2e..f16d81c9e198 100644
--- 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 303389 2011-12-16 09:30:48Z $
+ * $Id: dhd_cdc.c 324280 2012-03-28 19:01:17Z $
*
* 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_linux.c b/drivers/net/wireless/bcmdhd/dhd_linux.c
index 6cd0d7002c19..387d43dd858d 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 319136 2012-03-07 03:10:36Z $
+ * $Id: dhd_linux.c 325862 2012-04-04 22:59:48Z $
*/
#include <typedefs.h>
@@ -130,9 +130,9 @@ DECLARE_WAIT_QUEUE_HEAD(dhd_dpc_wait);
#if defined(OOB_INTR_ONLY)
extern void dhd_enable_oob_intr(struct dhd_bus *bus, bool enable);
#endif /* defined(OOB_INTR_ONLY) */
-
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27))
static void dhd_hang_process(struct work_struct *work);
-
+#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0))
MODULE_LICENSE("GPL v2");
#endif /* LinuxVer */
@@ -251,7 +251,9 @@ typedef struct dhd_info {
bool dhd_tasklet_create;
#endif /* DHDTHREAD */
tsk_ctl_t thr_sysioc_ctl;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27))
struct work_struct work_hang;
+#endif
/* Wakelocks */
#if defined(CONFIG_HAS_WAKELOCK) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27))
@@ -2755,9 +2757,9 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen, void *dev)
dhd->thr_sysioc_ctl.thr_pid = -1;
}
dhd_state |= DHD_ATTACH_STATE_THREADS_CREATED;
-
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27))
INIT_WORK(&dhd->work_hang, dhd_hang_process);
-
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */
/*
* Save the dhd_info into the priv
*/
@@ -3037,7 +3039,7 @@ dhd_preinit_ioctls(dhd_pub_t *dhd)
}
#endif /* SET_RANDOM_MAC_SOFTAP */
- DHD_ERROR(("Firmware = %s\n", fw_path));
+ DHD_TRACE(("Firmware = %s\n", fw_path));
#if !defined(AP) && defined(WLP2P)
/* Check if firmware with WFD support used */
if ((!op_mode && strstr(fw_path, "_p2p") != NULL)
@@ -3059,13 +3061,14 @@ dhd_preinit_ioctls(dhd_pub_t *dhd)
#if !defined(AP) && defined(WL_CFG80211)
/* Check if firmware with HostAPD support used */
if ((!op_mode && strstr(fw_path, "_apsta") != NULL) || (op_mode == HOSTAPD_MASK)) {
+ /* Disable A-band for HostAPD */
uint band = WLC_BAND_2G;
-
if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_BAND, (char *)&band, sizeof(band),
TRUE, 0)) < 0) {
DHD_ERROR(("%s:set band failed error (%d)\n", __FUNCTION__, ret));
}
+ /* Turn off wme if we are having only g ONLY firmware */
bcm_mkiovar("nmode", 0, 0, buf, sizeof(buf));
if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, sizeof(buf),
FALSE, 0)) < 0) {
@@ -3133,7 +3136,7 @@ dhd_preinit_ioctls(dhd_pub_t *dhd)
bcm_mkiovar("bus:txglomalign", (char *)&dongle_align, 4, iovbuf, sizeof(iovbuf));
dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0);
- /* disable glom option per default */
+ /* disable glom option for some chips */
chipID = (uint16)dhd_bus_chip_id(dhd);
if ((chipID == BCM4330_CHIP_ID) || (chipID == BCM4329_CHIP_ID)) {
DHD_INFO(("%s disable glom for chipID=0x%X\n", __FUNCTION__, chipID));
@@ -3285,8 +3288,15 @@ dhd_preinit_ioctls(dhd_pub_t *dhd)
bcmstrtok(&ptr, "\n", 0);
/* Print fw version info */
DHD_ERROR(("Firmware version = %s\n", buf));
+
DHD_BLOG(buf, strlen(buf) + 1);
DHD_BLOG(dhd_version, strlen(dhd_version) + 1);
+
+ /* Check and adjust IOCTL response timeout for Manufactring firmware */
+ if (strstr(buf, MANUFACTRING_FW) != NULL) {
+ dhd_os_set_ioctl_resp_timeout(IOCTL_RESP_TIMEOUT * 10);
+ DHD_ERROR(("%s : adjust IOCTL response time for Manufactring Firmware\n", __FUNCTION__));
+ }
}
done:
@@ -3640,7 +3650,9 @@ void dhd_detach(dhd_pub_t *dhdp)
}
#endif /* defined(CONFIG_HAS_EARLYSUSPEND) */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27))
cancel_work_sync(&dhd->work_hang);
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */
#if defined(CONFIG_BCMDHD_WEXT)
if (dhd->dhd_state & DHD_ATTACH_STATE_WL_ATTACH) {
@@ -4453,6 +4465,7 @@ dhd_dev_get_pno_status(struct net_device *dev)
#endif /* PNO_SUPPORT */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27))
static void dhd_hang_process(struct work_struct *work)
{
dhd_info_t *dhd;
@@ -4474,7 +4487,6 @@ static void dhd_hang_process(struct work_struct *work)
}
}
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27))
int net_os_send_hang_message(struct net_device *dev)
{
dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev);
diff --git a/drivers/net/wireless/bcmdhd/dhd_sdio.c b/drivers/net/wireless/bcmdhd/dhd_sdio.c
index e4fd2edef8fa..3086bb3cb68c 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 324417 2012-03-29 03:15:15Z $
+ * $Id: dhd_sdio.c 325395 2012-04-03 03:57:43Z $
*/
#include <typedefs.h>
@@ -754,8 +754,7 @@ dhdsdio_clkctl(dhd_bus_t *bus, uint target, bool pendok)
uint oldstate = bus->clkstate;
#endif /* DHD_DEBUG */
- DHD_TRACE(("%s: Enter bus->clkstate %u target %u\n", __FUNCTION__,
- bus->clkstate, target));
+ DHD_TRACE(("%s: Enter\n", __FUNCTION__));
/* Early exit if we're already there */
if (bus->clkstate == target) {
@@ -1482,8 +1481,9 @@ dhd_bus_rxctl(struct dhd_bus *bus, uchar *msg, uint msglen)
dhd_os_sdunlock(bus->dhd);
#endif /* DHD_DEBUG */
} else if (pending == TRUE) {
- DHD_CTL(("%s: canceled\n", __FUNCTION__));
- return -ERESTARTSYS;
+ /* possibly fw hangs so never responsed back */
+ DHD_ERROR(("%s: pending or timeout \n", __FUNCTION__));
+ return -ETIMEDOUT;
} else {
DHD_CTL(("%s: resumed for unknown reason?\n", __FUNCTION__));
#ifdef DHD_DEBUG
@@ -4596,13 +4596,29 @@ clkwait:
bcmsdh_intr_enable(sdh);
}
+#if defined(OOB_INTR_ONLY) && !defined(HW_OOB)
+ /* In case of SW-OOB(using edge trigger),
+ * Check interrupt status in the dongle again after enable irq on the host.
+ * and rechedule dpc if interrupt is pended in the dongle.
+ * There is a chance to miss OOB interrupt while irq is disabled on the host.
+ * No need to do this with HW-OOB(level trigger)
+ */
+ R_SDREG(newstatus, &regs->intstatus, retries);
+ if (bcmsdh_regfail(bus->sdh))
+ newstatus = 0;
+ if (newstatus & bus->hostintmask) {
+ bus->ipend = TRUE;
+ resched = TRUE;
+ }
+#endif /* defined(OOB_INTR_ONLY) && !defined(HW_OOB) */
+
if (TXCTLOK(bus) && bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL)) {
int ret, i;
uint8* frame_seq = bus->ctrl_frame_buf + SDPCM_FRAMETAG_LEN;
if (((bus->sih->chip == BCM4329_CHIP_ID) || /* limit to 4329 & 4330 for now */
(bus->sih->chip == BCM4330_CHIP_ID)) && (*frame_seq != bus->tx_seq)) {
- DHD_ERROR(("%s IOCTL frame seq lag detected!"
+ DHD_INFO(("%s IOCTL frame seq lag detected!"
" frm_seq:%d != bus->tx_seq:%d, corrected\n",
__FUNCTION__, *frame_seq, bus->tx_seq));
*frame_seq = bus->tx_seq;
@@ -6189,6 +6205,7 @@ dhd_bcmsdh_send_buf(dhd_bus_t *bus, uint32 addr, uint fn, uint flags, uint8 *buf
uint
dhd_bus_chip(struct dhd_bus *bus)
{
+ ASSERT(bus);
ASSERT(bus->sih != NULL);
return bus->sih->chip;
}
@@ -6196,6 +6213,7 @@ dhd_bus_chip(struct dhd_bus *bus)
void *
dhd_bus_pub(struct dhd_bus *bus)
{
+ ASSERT(bus);
return bus->dhd;
}
@@ -6242,7 +6260,6 @@ dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag)
bus->dhd->dongle_reset = TRUE;
bus->dhd->up = FALSE;
dhd_os_sdunlock(dhdp);
-
DHD_TRACE(("%s: WLAN OFF DONE\n", __FUNCTION__));
/* App can now remove power from device */
} else
diff --git a/drivers/net/wireless/bcmdhd/include/bcmdevs.h b/drivers/net/wireless/bcmdhd/include/bcmdevs.h
index ee01d8b45675..287f1c65fc9a 100644
--- a/drivers/net/wireless/bcmdhd/include/bcmdevs.h
+++ b/drivers/net/wireless/bcmdhd/include/bcmdevs.h
@@ -63,6 +63,7 @@
#define BCM_DNGL_BL_PID_43239 0xbd1b
#define BCM_DNGL_BDC_PID 0x0bdc
#define BCM_DNGL_JTAG_PID 0x4a44
+#define BCM_DNGL_BL_PID_4324 0xbd1c
#define BCM_HWUSB_PID_43239 43239
diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdstd.h b/drivers/net/wireless/bcmdhd/include/bcmsdstd.h
index c14444c57d36..c7382540b84f 100644
--- a/drivers/net/wireless/bcmdhd/include/bcmsdstd.h
+++ b/drivers/net/wireless/bcmdhd/include/bcmsdstd.h
@@ -21,7 +21,7 @@
* software in any way with any other Broadcom software provided under a license
* other than the GPL, without Broadcom's express prior written consent.
*
- * $Id: bcmsdstd.h 281604 2011-09-02 18:58:49Z $
+ * $Id: bcmsdstd.h 324819 2012-03-30 12:15:19Z $
*/
#ifndef _BCM_SD_STD_H
#define _BCM_SD_STD_H
@@ -180,6 +180,9 @@ struct sdioh_info {
#define DATA_TRANSFER_IDLE 0
#define DATA_TRANSFER_ONGOING 1
+#define CHECK_TUNING_PRE_DATA 1
+#define CHECK_TUNING_POST_DATA 2
+
/************************************************************
* Internal interfaces: per-port references into bcmsdstd.c
@@ -227,10 +230,12 @@ extern int sdstd_waitbits(sdioh_info_t *sd, uint16 norm, uint16 err, bool yield,
extern void sdstd_3_enable_retuning_int(sdioh_info_t *sd);
extern void sdstd_3_disable_retuning_int(sdioh_info_t *sd);
extern bool sdstd_3_is_retuning_int_set(sdioh_info_t *sd);
+extern void sdstd_3_check_and_do_tuning(sdioh_info_t *sd, int tuning_param);
extern bool sdstd_3_check_and_set_retuning(sdioh_info_t *sd);
extern int sdstd_3_get_tune_state(sdioh_info_t *sd);
extern int sdstd_3_get_data_state(sdioh_info_t *sd);
extern void sdstd_3_set_tune_state(sdioh_info_t *sd, int state);
+extern void sdstd_3_set_data_state(sdioh_info_t *sd, int state);
extern uint8 sdstd_3_get_tuning_exp(sdioh_info_t *sd);
extern uint32 sdstd_3_get_uhsi_clkmode(sdioh_info_t *sd);
extern int sdstd_3_clk_tuning(sdioh_info_t *sd, uint32 sd3ClkMode);
diff --git a/drivers/net/wireless/bcmdhd/include/dhdioctl.h b/drivers/net/wireless/bcmdhd/include/dhdioctl.h
index 0312d2206013..175ff8545a0c 100644
--- a/drivers/net/wireless/bcmdhd/include/dhdioctl.h
+++ b/drivers/net/wireless/bcmdhd/include/dhdioctl.h
@@ -25,7 +25,7 @@
* software in any way with any other Broadcom software provided under a license
* other than the GPL, without Broadcom's express prior written consent.
*
- * $Id: dhdioctl.h 307573 2012-01-12 00:04:39Z $
+ * $Id: dhdioctl.h 323572 2012-03-26 06:28:14Z $
*/
#ifndef _dhdioctl_h_
@@ -87,7 +87,8 @@ enum {
#define DHD_BTA_VAL 0x1000
#define DHD_ISCAN_VAL 0x2000
#define DHD_ARPOE_VAL 0x4000
-#define DHD_WL_VAL 0x8000
+#define DHD_REORDER_VAL 0x8000
+#define DHD_WL_VAL 0x10000
#ifdef SDTEST
/* For pktgen iovar */
diff --git a/drivers/net/wireless/bcmdhd/include/epivers.h b/drivers/net/wireless/bcmdhd/include/epivers.h
index 9fd097ec8b98..b3560bd9203f 100644
--- a/drivers/net/wireless/bcmdhd/include/epivers.h
+++ b/drivers/net/wireless/bcmdhd/include/epivers.h
@@ -32,17 +32,17 @@
#define EPI_RC_NUMBER 195
-#define EPI_INCREMENTAL_NUMBER 46
+#define EPI_INCREMENTAL_NUMBER 53
#define EPI_BUILD_NUMBER 0
-#define EPI_VERSION 5, 90, 195, 46
+#define EPI_VERSION 5, 90, 195, 53
-#define EPI_VERSION_NUM 0x055ac32e
+#define EPI_VERSION_NUM 0x055ac335
#define EPI_VERSION_DEV 5.90.195
-#define EPI_VERSION_STR "5.90.195.46"
+#define EPI_VERSION_STR "5.90.195.53"
#endif
diff --git a/drivers/net/wireless/bcmdhd/wl_android.c b/drivers/net/wireless/bcmdhd/wl_android.c
index b98fe1d8f784..631c12bda8b6 100644
--- a/drivers/net/wireless/bcmdhd/wl_android.c
+++ b/drivers/net/wireless/bcmdhd/wl_android.c
@@ -619,7 +619,7 @@ int wl_android_init(void)
{
int ret = 0;
- dhd_msg_level = DHD_ERROR_VAL;
+ dhd_msg_level |= DHD_ERROR_VAL;
#ifdef ENABLE_INSMOD_NO_FW_LOAD
dhd_download_fw_on_driverload = FALSE;
#endif /* ENABLE_INSMOD_NO_FW_LOAD */
@@ -690,7 +690,7 @@ void wl_android_wifictrl_func_del(void)
}
}
-void *wl_android_prealloc(int section, unsigned long size)
+void* wl_android_prealloc(int section, unsigned long size)
{
void *alloc_ptr = NULL;
if (wifi_control_data && wifi_control_data->mem_prealloc) {
diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/bcmdhd/wl_cfg80211.c
index 178a23103e63..8009e03fdcf3 100644
--- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c
+++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.c
@@ -3352,6 +3352,7 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev,
wifi_p2p_action_frame_t *p2p_act_frm = NULL;
wifi_p2psd_gas_pub_act_frame_t *sd_act_frm = NULL;
s8 eabuf[ETHER_ADDR_STR_LEN];
+ int retry_cnt = 0;
WL_DBG(("Enter \n"));
@@ -3496,9 +3497,9 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev,
}
wl_cfgp2p_print_actframe(true, action_frame->data, action_frame->len);
- /*
- * To make sure to send successfully action frame, we have to turn off mpc
- */
+ /*
+ * To make sure to send successfully action frame, we have to turn off mpc
+ */
if (act_frm && ((act_frm->subtype == P2P_PAF_GON_REQ) ||
(act_frm->subtype == P2P_PAF_GON_RSP) ||
@@ -3506,6 +3507,9 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev,
(act_frm->subtype == P2P_PAF_PROVDIS_REQ))) {
wldev_iovar_setint(dev, "mpc", 0);
}
+ if (act_frm->subtype == P2P_PAF_GON_RSP)
+ retry_cnt = 1;
+ else retry_cnt = WL_ACT_FRAME_RETRY;
if (act_frm && act_frm->subtype == P2P_PAF_DEVDIS_REQ) {
af_params->dwell_time = WL_LONG_DWELL_TIME;
@@ -3530,23 +3534,12 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev,
} else {
ack = (wl_cfgp2p_tx_action_frame(wl, dev, af_params, bssidx)) ? false : true;
if (!ack) {
- if (wl_to_p2p_bss_saved_ie(wl, P2PAPI_BSSCFG_DEVICE).p2p_probe_req_ie_len) {
- /* if the NO ACK occurs, the peer device will be on
- * listen channel of the peer
- * So, we have to find the peer and send action frame on
- * that channel.
- */
- ack = wl_cfg80211_send_at_common_channel(wl, dev, af_params);
- } else {
- for (retry = 0; retry < WL_CHANNEL_SYNC_RETRY; retry++) {
+ for (retry = 1; retry < WL_CHANNEL_SYNC_RETRY; retry++) {
ack = (wl_cfgp2p_tx_action_frame(wl, dev,
af_params, bssidx)) ? false : true;
if (ack)
break;
}
-
- }
-
}
}
@@ -3619,7 +3612,7 @@ wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev,
__FUNCTION__, channel));
wl->hostapd_chan = channel;
if (channel == 14)
- return err;
+ return err; /* hostapd requested ch auto-select, will be done later */
}
WL_DBG(("netdev_ifidx(%d), chan_type(%d) target channel(%d) \n",
@@ -4251,6 +4244,7 @@ int wl_cfg80211_sched_scan_start(struct wiphy *wiphy,
request->n_ssids, pno_time, pno_repeat, pno_freq_expo_max));
#if defined(WL_ENABLE_P2P_IF)
+ /* While GO is operational, PNO is not supported */
if (dhd_cfg80211_get_opmode(wl) & P2P_GO_ENABLED) {
WL_DBG(("PNO not enabled! op_mode: P2P GO"));
return -1;
@@ -6676,7 +6670,7 @@ s32 wl_update_wiphybands(struct wl_priv *wl)
err = wldev_ioctl(wl_to_prmry_ndev(wl), WLC_GET_BANDLIST, bandlist,
sizeof(bandlist), false);
if (unlikely(err)) {
- WL_ERR(("error (%d)\n", err));
+ WL_ERR(("error read bandlist (%d)\n", err));
return err;
}
wiphy = wl_to_wiphy(wl);
@@ -6686,12 +6680,14 @@ s32 wl_update_wiphybands(struct wl_priv *wl)
err = wldev_iovar_getint(wl_to_prmry_ndev(wl), "nmode", &nmode);
if (unlikely(err)) {
- WL_ERR(("error (%d)\n", err));
+ WL_ERR(("error reading nmode (%d)\n", err));
}
-
- err = wldev_iovar_getint(wl_to_prmry_ndev(wl), "mimo_bw_cap", &bw_40);
- if (unlikely(err)) {
- WL_ERR(("error (%d)\n", err));
+ else {
+ /* For nmodeonly check bw cap */
+ err = wldev_iovar_getint(wl_to_prmry_ndev(wl), "mimo_bw_cap", &bw_40);
+ if (unlikely(err)) {
+ WL_ERR(("error get mimo_bw_cap (%d)\n", err));
+ }
}
for (i = 1; i <= nband && i < sizeof(bandlist); i++) {
@@ -6705,7 +6701,7 @@ s32 wl_update_wiphybands(struct wl_priv *wl)
&__wl_band_2ghz;
index = IEEE80211_BAND_2GHZ;
}
-
+#if defined WL_ENABLE_P2P_IF
if ((index >= 0) && nmode) {
wiphy->bands[index]->ht_cap.cap =
IEEE80211_HT_CAP_DSSSCCK40
@@ -6714,6 +6710,7 @@ s32 wl_update_wiphybands(struct wl_priv *wl)
wiphy->bands[index]->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_16K;
wiphy->bands[index]->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16;
}
+#endif
}
wiphy_apply_custom_regulatory(wiphy, &brcm_regdom);
@@ -6755,6 +6752,7 @@ static s32 __wl_cfg80211_down(struct wl_priv *wl)
struct net_device *ndev = wl_to_prmry_ndev(wl);
#ifdef WL_ENABLE_P2P_IF
struct wiphy *wiphy = wl_to_prmry_ndev(wl)->ieee80211_ptr->wiphy;
+ struct net_device *p2p_net = wl->p2p_net;
#endif
WL_DBG(("In\n"));
@@ -6786,7 +6784,11 @@ static s32 __wl_cfg80211_down(struct wl_priv *wl)
wiphy->interface_modes = (wiphy->interface_modes)
& (~(BIT(NL80211_IFTYPE_P2P_CLIENT)|
BIT(NL80211_IFTYPE_P2P_GO)));
-#endif
+ if ((p2p_net) && (p2p_net->flags & IFF_UP)) {
+ /* p2p0 interface is still UP. Bring it down */
+ p2p_net->flags &= ~IFF_UP;
+ }
+#endif /* WL_ENABLE_P2P_IF */
spin_unlock_irqrestore(&wl->cfgdrv_lock, flags);
DNGL_FUNC(dhd_cfg80211_down, (wl));
@@ -7035,8 +7037,7 @@ static void wl_init_eq_lock(struct wl_priv *wl)
static void wl_delay(u32 ms)
{
- if (ms < 1000 / HZ) {
- cond_resched();
+ if (in_atomic() || ms < 1000 / HZ) {
mdelay(ms);
} else {
msleep(ms);
diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.h b/drivers/net/wireless/bcmdhd/wl_cfg80211.h
index 4cea796fa51f..818eff594115 100644
--- a/drivers/net/wireless/bcmdhd/wl_cfg80211.h
+++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.h
@@ -131,7 +131,9 @@ do { \
#define IFACE_MAX_CNT 2
#define WL_SCAN_TIMER_INTERVAL_MS 8000 /* Scan timeout */
-#define WL_CHANNEL_SYNC_RETRY 5
+#define WL_CHANNEL_SYNC_RETRY 1
+#define WL_ACT_FRAME_RETRY 5
+
#define WL_INVALID -1
/* driver status */
diff --git a/drivers/net/wireless/bcmdhd/wl_iw.h b/drivers/net/wireless/bcmdhd/wl_iw.h
index 20fa24909f87..9cdb53dfef8c 100644
--- a/drivers/net/wireless/bcmdhd/wl_iw.h
+++ b/drivers/net/wireless/bcmdhd/wl_iw.h
@@ -209,7 +209,6 @@ extern int net_os_wake_lock_ctrl_timeout_enable(struct net_device *dev, int val
extern int net_os_set_suspend_disable(struct net_device *dev, int val);
extern int net_os_set_suspend(struct net_device *dev, int val, int force);
extern int net_os_set_dtim_skip(struct net_device *dev, int val);
-extern int net_os_send_hang_message(struct net_device *dev);
extern void get_customized_country_code(char *country_iso_code, wl_country_t *cspec);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)