summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSrinivas Girigowda <sgirigow@qca.qualcomm.com>2014-02-14 12:33:35 -0800
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-02-18 01:00:26 -0800
commitcf0172860e158816c9be42343d735465a7a55b8d (patch)
tree1910576cdc1b49ab0f713f168d710b4522289113
parent151dc450ed91a71e28e3efa8efbd1a2d5e47af6e (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.c6
-rw-r--r--CORE/SERVICES/WMA/wma.c33
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);