From 1ae65638227a7a3101de4811f337b67868fca408 Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Thu, 3 Dec 2015 16:45:35 +0530 Subject: [PATCH] qcacld-3.0: Do not send DEL BSS to FW if ADD BSS fails qcacld-2.0 to qcacld-3.0 propagation Even though ADD_BSS fails the driver tries to send DEL BSS to firmware which will crash upon receiving DEL BSS. To avoid this crash do not send DEL BSS to Firmware if ADD BSS fails and just do cleanup. Change-Id: Ieabf241c8277ae76bb5f491f9d8a2b783d8ea47e CRs-Fixed: 929249 --- core/mac/src/pe/include/lim_session.h | 1 + core/mac/src/pe/lim/lim_assoc_utils.c | 17 ++++++++++------- .../src/pe/lim/lim_process_mlm_rsp_messages.c | 18 +++++++++++++++++- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/core/mac/src/pe/include/lim_session.h b/core/mac/src/pe/include/lim_session.h index 5d27af28a009..4b0ebe7c459f 100644 --- a/core/mac/src/pe/include/lim_session.h +++ b/core/mac/src/pe/include/lim_session.h @@ -483,6 +483,7 @@ typedef struct sPESession /* Added to Support BT-AMP */ /* flag to indicate country code in beacon */ uint8_t country_info_present; uint8_t nss; + bool add_bss_failed; } tPESession, *tpPESession; /*------------------------------------------------------------------------- diff --git a/core/mac/src/pe/lim/lim_assoc_utils.c b/core/mac/src/pe/lim/lim_assoc_utils.c index c981c28b1d50..3cd37489f05a 100644 --- a/core/mac/src/pe/lim/lim_assoc_utils.c +++ b/core/mac/src/pe/lim/lim_assoc_utils.c @@ -671,13 +671,16 @@ lim_cleanup_rx_path(tpAniSirGlobal pMac, tpDphHashNode pStaDs, /* increment a debug count */ pMac->lim.gLimNumRxCleanup++; #endif - - if (psessionEntry->limSmeState == eLIM_SME_JOIN_FAILURE_STATE) { - retCode = - lim_del_bss(pMac, pStaDs, psessionEntry->bssIdx, - psessionEntry); - } else - retCode = lim_del_sta(pMac, pStaDs, true, psessionEntry); + /* Do DEL BSS or DEL STA only if ADD BSS was success */ + if (!psessionEntry->add_bss_failed) { + if (psessionEntry->limSmeState == eLIM_SME_JOIN_FAILURE_STATE) { + retCode = + lim_del_bss(pMac, pStaDs, psessionEntry->bssIdx, + psessionEntry); + } else + retCode = lim_del_sta(pMac, + pStaDs, true, psessionEntry); + } return retCode; diff --git a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c index 0fe37fe6da02..a4afe4c5f3d6 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c +++ b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c @@ -1546,12 +1546,19 @@ lim_handle_sme_join_result(tpAniSirGlobal mac_ctx, * to SME */ lim_cleanup_rx_path(mac_ctx, sta_ds, session_entry); + /* Cleanup if add bss failed */ + if (session_entry->add_bss_failed) { + dph_delete_hash_entry(mac_ctx, + sta_ds->staAddr, sta_ds->assocId, + &session_entry->dph.dphHashTable); + goto error; + } cdf_mem_free(session_entry->pLimJoinReq); session_entry->pLimJoinReq = NULL; return; } } - +error: cdf_mem_free(session_entry->pLimJoinReq); session_entry->pLimJoinReq = NULL; /* Delete teh session if JOIN failure occurred. */ @@ -1624,9 +1631,17 @@ lim_handle_sme_reaasoc_result(tpAniSirGlobal pMac, tSirResultCodes resultCode, pStaDs->mlmStaContext.resultCode = resultCode; pStaDs->mlmStaContext.protStatusCode = protStatusCode; lim_cleanup_rx_path(pMac, pStaDs, psessionEntry); + /* Cleanup if add bss failed */ + if (psessionEntry->add_bss_failed) { + dph_delete_hash_entry(pMac, + pStaDs->staAddr, pStaDs->assocId, + &psessionEntry->dph.dphHashTable); + goto error; + } return; } } +error: /* Delete teh session if REASSOC failure occurred. */ if (resultCode != eSIR_SME_SUCCESS) { if (NULL != psessionEntry) { @@ -3056,6 +3071,7 @@ lim_process_sta_mlm_add_bss_rsp(tpAniSirGlobal mac_ctx, else mlm_assoc_cnf.resultCode = (tSirResultCodes) eSIR_SME_REFUSED; + session_entry->add_bss_failed = true; } if (mlm_assoc_cnf.resultCode != eSIR_SME_SUCCESS) {