diff options
| author | Srinivas Girigowda <sgirigow@qca.qualcomm.com> | 2014-02-14 12:33:35 -0800 |
|---|---|---|
| committer | Akash Patel <c_akashp@qca.qualcomm.com> | 2014-02-18 01:00:26 -0800 |
| commit | cf0172860e158816c9be42343d735465a7a55b8d (patch) | |
| tree | 1910576cdc1b49ab0f713f168d710b4522289113 | |
| parent | 151dc450ed91a71e28e3efa8efbd1a2d5e47af6e (diff) | |
qcacld: Fix for ping stall due to ADD_BSS timeout
During LFR and LFR MCC testing, ADD_BSS_REQ takes
more than 1sec and FW indicates VDEV_START after 1sec (NOA case)
Which is causing ADD_BSS_REQ timer to expire and trigger
ADD_BSS_RSP to the lim and lim mlm state is set to FT_REASSOC STATE
but the code is taking ASSOC_CNF path and asserting and it is
not tearing down the link.
The fix is to
1. Increase the ADD_BSS_REQ timer to 2sec incaseof roaming
2. upon ADD_BSS_REQ timeout, issue vdev down/stop and
remove peer
3. if the lim mlm state is FT_REASSOC_STATE then
take the REASSOC_CNF path
Change-Id: I624eb3045c21f9feff059d12cdd0a6c2c04ef0ef
CRs-Fixed: 616357
| -rw-r--r-- | CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c | 6 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 33 |
2 files changed, 37 insertions, 2 deletions
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c index 63afce5decf7..518a33c53632 100644 --- a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c @@ -2960,7 +2960,11 @@ limProcessStaMlmAddBssRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ,tpPESession ps limProcessStaMlmAddBssRspPreAssoc(pMac, limMsgQ, psessionEntry); goto end; } - if( eLIM_MLM_WT_ADD_BSS_RSP_REASSOC_STATE == psessionEntry->limMlmState ) + if (eLIM_MLM_WT_ADD_BSS_RSP_REASSOC_STATE == psessionEntry->limMlmState +#if defined(WLAN_FEATURE_VOWIFI_11R) || defined(FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR) + || (eLIM_MLM_WT_ADD_BSS_RSP_FT_REASSOC_STATE == psessionEntry->limMlmState) +#endif + ) { mesgType = LIM_MLM_REASSOC_CNF; subType = LIM_REASSOC; diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 03f5e40a1558..37f88576e973 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -177,6 +177,9 @@ static struct wma_target_req * wma_fill_vdev_req(tp_wma_handle wma, u_int8_t vdev_id, u_int32_t msg_type, u_int8_t type, void *params, u_int32_t timeout); +static int32_t wmi_unified_vdev_stop_send(wmi_unified_t wmi, u_int8_t vdev_id); +static void wma_remove_vdev_req(tp_wma_handle wma, u_int8_t vdev_id, + u_int8_t type); static tANI_U32 gFwWlanFeatCaps; @@ -5550,6 +5553,7 @@ void wma_vdev_resp_timer(void *data) ol_txrx_peer_handle peer; ol_txrx_pdev_handle pdev; u_int8_t peer_id; + struct wma_target_req *msg; #ifdef QCA_IBSS_SUPPORT tDelStaSelfParams del_sta_param; #endif @@ -5626,6 +5630,33 @@ void wma_vdev_resp_timer(void *data) params->status = VOS_STATUS_E_TIMEOUT; WMA_LOGA("%s: WDA_ADD_BSS_REQ timedout", __func__); + peer = ol_txrx_find_peer_by_addr(pdev, params->bssId, + &peer_id); + if (!peer) { + WMA_LOGP("%s: Failed to find peer %pM", __func__, + params->bssId); + } + msg = wma_fill_vdev_req(wma, params->sessionId, WDA_DELETE_BSS_REQ, + WMA_TARGET_REQ_TYPE_VDEV_STOP, params, 1000); + if (!msg) { + WMA_LOGP("%s: Failed to fill vdev request for vdev_id %d", + __func__, params->sessionId); + goto error0; + } + if (wmi_unified_vdev_stop_send(wma->wmi_handle, params->sessionId)) { + WMA_LOGP("%s: %d Failed to send vdev stop", + __func__, __LINE__); + wma_remove_vdev_req(wma, params->sessionId, + WMA_TARGET_REQ_TYPE_VDEV_STOP); + goto error0; + } + WMA_LOGI("%s: bssid %pM vdev_id %d", + __func__, params->bssId, params->sessionId); + +error0: + if (peer) + wma_remove_peer(wma, params->bssId, + params->sessionId, peer); wma_send_msg(wma, WDA_ADD_BSS_RSP, (void *)params, 0); } vos_timer_destroy(&tgt_req->event_timeout); @@ -7693,7 +7724,7 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss) } msg = wma_fill_vdev_req(wma, vdev_id, WDA_ADD_BSS_REQ, WMA_TARGET_REQ_TYPE_VDEV_START, - add_bss, 1000); + add_bss, 2000); if (!msg) { WMA_LOGP("%s Failed to allocate vdev request vdev_id %d", __func__, vdev_id); |
