summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkash Patel <akashp@codeaurora.org>2014-05-29 10:45:15 -0700
committerAkash Patel <akashp@codeaurora.org>2014-05-29 10:46:18 -0700
commit46617fc5414ebbfb01b0276e2eaa4b682d50dbea (patch)
tree751dff499cb9c5fb3966a05f596b0b932585c6d8
parent8b8647bd77dd30ca225062a5ad93deea3e3efc47 (diff)
parent229ecb8051909ce351a1e7131c5f1f91fc855a20 (diff)
Release 1.0.0.116 QCACLD WLAN Driver
Merge remote-tracking branch 'origin/caf/caf-wlan/master' * origin/caf/caf-wlan/master: Cafstaging Release 1.0.0.116 qcacld-new: enhance tdls work thread to handle driver unloading qca_cld: Re-register HDD TX resume callback in SSR re-init routine qcacld: Optimization for AV glitches seen in WiFi window qcacld-new: Print firmware crash dump qcacld: Fix for DFS master mode radar detection Change-Id: Idab09a9604c35ddee36a1256cd9678545186eac3
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c9
-rwxr-xr-xCORE/HDD/src/wlan_hdd_main.c8
-rw-r--r--CORE/HDD/src/wlan_hdd_tdls.c11
-rw-r--r--CORE/MAC/inc/qwlan_version.h4
-rw-r--r--CORE/SERVICES/DFS/src/dfs_init.c6
-rw-r--r--CORE/SERVICES/HIF/PCIe/if_pci.c3
-rw-r--r--CORE/SERVICES/HIF/USB/usbdrv.c19
-rw-r--r--CORE/SERVICES/WMA/wma.c14
-rw-r--r--CORE/SERVICES/WMA/wma.h4
-rw-r--r--CORE/VOSS/src/vos_sched.c4
-rw-r--r--CORE/VOSS/src/vos_sched.h2
11 files changed, 70 insertions, 14 deletions
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 023678c2d11c..77738484b5d8 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -9574,7 +9574,6 @@ static int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *d
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s: Mgmt Tx Completion failed status %ld TxCompletion %u",
__func__, rc, pAdapter->mgmtTxCompletionStatus);
- pAdapter->mgmtTxCompletionStatus = FALSE;
if (pHddCtx->isLogpInProgress)
{
@@ -9583,6 +9582,14 @@ static int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *d
return -EAGAIN;
}
+ if (pHddCtx->isUnloadInProgress)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: Unloading/Loading in Progress. Ignore!!!", __func__);
+ return -EAGAIN;
+ }
+
+ pAdapter->mgmtTxCompletionStatus = FALSE;
wlan_hdd_tdls_check_bmps(pAdapter);
return -EINVAL;
}
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 339fc85e3700..a06740e8ce0f 100755
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -8982,6 +8982,12 @@ VOS_STATUS hdd_start_all_adapters( hdd_context_t *pHddCtx )
WLAN_STATUS_ASSOC_DENIED_UNSPEC,
GFP_KERNEL);
}
+
+#ifdef QCA_LL_TX_FLOW_CT
+ WLANTL_RegisterTXFlowControl(pHddCtx->pvosContext, hdd_tx_resume_cb,
+ pAdapter->sessionId, (void *)pAdapter);
+#endif
+
break;
case WLAN_HDD_SOFTAP:
@@ -12001,6 +12007,8 @@ static void hdd_driver_exit(void)
vos_set_load_unload_in_progress(VOS_MODULE_ID_VOSS, TRUE);
}
+ vos_wait_for_work_thread_completion(__func__);
+
#ifdef QCA_WIFI_ISOC
//Do all the cleanup before deregistering the driver
hdd_wlan_exit(pHddCtx);
diff --git a/CORE/HDD/src/wlan_hdd_tdls.c b/CORE/HDD/src/wlan_hdd_tdls.c
index 827989ec4005..db9e8bc615c0 100644
--- a/CORE/HDD/src/wlan_hdd_tdls.c
+++ b/CORE/HDD/src/wlan_hdd_tdls.c
@@ -43,7 +43,7 @@
#include <net/ieee80211_radiotap.h>
#include "wlan_hdd_tdls.h"
#include "wlan_hdd_cfg80211.h"
-
+#include "vos_sched.h"
#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
static tANI_S32 wlan_hdd_get_tdls_discovery_peer_cnt(tdlsCtx_t *pHddTdlsCtx);
@@ -2325,7 +2325,7 @@ void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx,
mutex_unlock(&pHddCtx->tdls_lock);
}
-static void wlan_hdd_tdls_pre_setup(struct work_struct *work)
+static void __wlan_hdd_tdls_pre_setup(struct work_struct *work)
{
tdlsCtx_t *pHddTdlsCtx =
container_of(work, tdlsCtx_t, implicit_setup);
@@ -2445,6 +2445,13 @@ done:
return;
}
+static void wlan_hdd_tdls_pre_setup(struct work_struct *work)
+{
+ vos_ssr_protect(__func__);
+ __wlan_hdd_tdls_pre_setup(work);
+ vos_ssr_unprotect(__func__);
+}
+
tANI_U32 wlan_hdd_tdls_discovery_sent_cnt(hdd_context_t *pHddCtx)
{
hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h
index 96857ca8e1b2..8f88c431a308 100644
--- a/CORE/MAC/inc/qwlan_version.h
+++ b/CORE/MAC/inc/qwlan_version.h
@@ -42,9 +42,9 @@ BRIEF DESCRIPTION:
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 0
#define QWLAN_VERSION_EXTRA ""
-#define QWLAN_VERSION_BUILD 115
+#define QWLAN_VERSION_BUILD 116
-#define QWLAN_VERSIONSTR "1.0.0.115"
+#define QWLAN_VERSIONSTR "1.0.0.116"
#ifdef QCA_WIFI_2_0
diff --git a/CORE/SERVICES/DFS/src/dfs_init.c b/CORE/SERVICES/DFS/src/dfs_init.c
index 1c1fc243bf29..be4262fbc4aa 100644
--- a/CORE/SERVICES/DFS/src/dfs_init.c
+++ b/CORE/SERVICES/DFS/src/dfs_init.c
@@ -201,8 +201,10 @@ int dfs_init_radar_filters(struct ieee80211com *ic,
__func__, __LINE__, dfs->dfsdomain);
/* Disable radar detection since we don't have a radar domain */
dfs->dfs_proc_phyerr &= ~DFS_RADAR_EN;
- /* returning error. return: 1-Fail, 0-Success */
- return DFS_STATUS_FAIL;
+ /* Returning success though we are not completing init. A failure
+ * will fail dfs_attach also.
+ */
+ return DFS_STATUS_SUCCESS;
}
VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.c b/CORE/SERVICES/HIF/PCIe/if_pci.c
index 3873ce71ea8a..a33037c99472 100644
--- a/CORE/SERVICES/HIF/PCIe/if_pci.c
+++ b/CORE/SERVICES/HIF/PCIe/if_pci.c
@@ -1085,6 +1085,9 @@ again:
goto err_iomap;
}
+ /* Disable asynchronous suspend */
+ device_disable_async_suspend(&pdev->dev);
+
sc = A_MALLOC(sizeof(*sc));
if (!sc) {
ret = -ENOMEM;
diff --git a/CORE/SERVICES/HIF/USB/usbdrv.c b/CORE/SERVICES/HIF/USB/usbdrv.c
index 0073485a731d..986c88f8ef35 100644
--- a/CORE/SERVICES/HIF/USB/usbdrv.c
+++ b/CORE/SERVICES/HIF/USB/usbdrv.c
@@ -27,6 +27,7 @@
#include <linux/module.h>
#include <linux/usb.h>
#include <linux/version.h>
+#include <linux/atomic.h>
#include "hif_usb_internal.h"
#include <athdefs.h>
@@ -973,6 +974,10 @@ void usb_hif_io_comp_work(struct work_struct *work)
adf_nbuf_t buf;
HIF_DEVICE_USB *device;
HTC_FRAME_HDR *HtcHdr;
+ A_UINT8 *data;
+ A_UINT32 *reg;
+ A_UINT32 len, i;
+ static A_UINT32 assert_pattern = 0x0000c600;
AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n", __func__));
device = pipe->device;
@@ -1000,11 +1005,21 @@ void usb_hif_io_comp_work(struct work_struct *work)
AR_DEBUG_PRINTF(USB_HIF_DEBUG_BULK_IN,
("+athusb recv callback buf:" "0x%p\n",
buf));
- device->htcCallbacks.rxCompletionHandler(
+ adf_nbuf_peek_header(buf, &data, &len);
+ if (!memcmp(data, &assert_pattern, sizeof(assert_pattern))) {
+ printk("Firmware crash detected... len %d\n", len);
+ reg = (A_UINT32 *) (data+4);
+ for (i = 0; i < 60; i++, reg++) {
+ printk("[%02d] : 0x%08X\n", i, *reg);
+ }
+ dev_kfree_skb(buf);
+ } else {
+ device->htcCallbacks.rxCompletionHandler(
device->htcCallbacks.Context, buf,
pipe->logical_pipe_num);
- AR_DEBUG_PRINTF(USB_HIF_DEBUG_BULK_IN,
+ AR_DEBUG_PRINTF(USB_HIF_DEBUG_BULK_IN,
("-athusb recv callback\n"));
+ }
}
}
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index fe24e21f7dc1..a6b6c0bb0775 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -4597,13 +4597,25 @@ VOS_STATUS wma_get_buf_start_scan_cmd(tp_wma_handle wma_handle,
cmd->scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
/* Default P2P burst duration of 120 ms will cover
* 3 channels with default max dwell time 40 ms.
+ * Cap limit will be set by
+ * WMA_P2P_SCAN_MAX_BURST_DURATION. Burst duration
+ * should be such that no channel is scanned less
+ * than the dwell time in normal scenarios.
*/
- cmd->burst_duration = WMA_P2P_SCAN_MAX_BURST_DURATION;
if (scan_req->channelList.numChannels == P2P_SOCIAL_CHANNELS
&& (!IS_MIRACAST_SESSION_PRESENT(pMac)))
cmd->repeat_probe_time = scan_req->maxChannelTime/5;
else
cmd->repeat_probe_time = scan_req->maxChannelTime/3;
+
+ cmd->burst_duration = WMA_BURST_SCAN_MAX_NUM_OFFCHANNELS * scan_req->maxChannelTime;
+ if (cmd->burst_duration > WMA_P2P_SCAN_MAX_BURST_DURATION) {
+ u_int8_t channels = WMA_P2P_SCAN_MAX_BURST_DURATION / scan_req->maxChannelTime;
+ if (channels)
+ cmd->burst_duration = channels * scan_req->maxChannelTime;
+ else
+ cmd->burst_duration = WMA_P2P_SCAN_MAX_BURST_DURATION;
+ }
break;
default:
WMA_LOGE("Invalid scan type");
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index 4425520b65cd..d73059af7ba8 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -139,10 +139,10 @@
#define WMA_HW_DEF_SCAN_MAX_DURATION 30000 /* 30 secs */
/* Max offchannel duration */
-#define WMA_BURST_SCAN_MAX_NUM_OFFCHANNELS (5)
+#define WMA_BURST_SCAN_MAX_NUM_OFFCHANNELS (3)
#define WMA_SCAN_NPROBES_DEFAULT (2)
#define WMA_SCAN_IDLE_TIME_DEFAULT (25)
-#define WMA_P2P_SCAN_MAX_BURST_DURATION (120)
+#define WMA_P2P_SCAN_MAX_BURST_DURATION (180)
/* Roaming default values
* All time and period values are in milliseconds.
diff --git a/CORE/VOSS/src/vos_sched.c b/CORE/VOSS/src/vos_sched.c
index 177d65917c36..fd2685e427a4 100644
--- a/CORE/VOSS/src/vos_sched.c
+++ b/CORE/VOSS/src/vos_sched.c
@@ -76,7 +76,7 @@
/* MAX iteration count to wait for Entry point to exit before
* we proceed with SSR in WD Thread
*/
-#define MAX_SSR_WAIT_ITERATIONS 50
+#define MAX_SSR_WAIT_ITERATIONS 75
static atomic_t ssr_protect_entry_count;
@@ -2398,7 +2398,7 @@ bool vos_is_ssr_ready(const char *caller_func)
if (!count)
return false;
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"Allowing SSR for %s", caller_func);
return true;
diff --git a/CORE/VOSS/src/vos_sched.h b/CORE/VOSS/src/vos_sched.h
index 9abd01d09bc0..228a9deeb0f8 100644
--- a/CORE/VOSS/src/vos_sched.h
+++ b/CORE/VOSS/src/vos_sched.h
@@ -654,4 +654,6 @@ void vos_ssr_protect(const char *caller_func);
void vos_ssr_unprotect(const char *caller_func);
bool vos_is_ssr_ready(const char *caller_func);
+#define vos_wait_for_work_thread_completion(func) vos_is_ssr_ready(func)
+
#endif // #if !defined __VOSS_SCHED_H