diff options
| author | Akash Patel <akashp@codeaurora.org> | 2014-05-29 10:45:15 -0700 |
|---|---|---|
| committer | Akash Patel <akashp@codeaurora.org> | 2014-05-29 10:46:18 -0700 |
| commit | 46617fc5414ebbfb01b0276e2eaa4b682d50dbea (patch) | |
| tree | 751dff499cb9c5fb3966a05f596b0b932585c6d8 | |
| parent | 8b8647bd77dd30ca225062a5ad93deea3e3efc47 (diff) | |
| parent | 229ecb8051909ce351a1e7131c5f1f91fc855a20 (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.c | 9 | ||||
| -rwxr-xr-x | CORE/HDD/src/wlan_hdd_main.c | 8 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_tdls.c | 11 | ||||
| -rw-r--r-- | CORE/MAC/inc/qwlan_version.h | 4 | ||||
| -rw-r--r-- | CORE/SERVICES/DFS/src/dfs_init.c | 6 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/PCIe/if_pci.c | 3 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/USB/usbdrv.c | 19 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 14 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.h | 4 | ||||
| -rw-r--r-- | CORE/VOSS/src/vos_sched.c | 4 | ||||
| -rw-r--r-- | CORE/VOSS/src/vos_sched.h | 2 |
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 |
