diff options
| author | Deepak Dhamdhere <ddhamdhe@codeaurora.org> | 2016-10-27 10:58:29 -0700 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2016-11-01 20:52:21 -0700 |
| commit | 70229e56bfbc49893907dcd26902de94e302849c (patch) | |
| tree | 8845964c150c1f486ba23cb60a0f3caaa7863706 | |
| parent | 88d2b7daf159da42a65d7b623f9ae84dd0841896 (diff) | |
qcacld-3.0: Do not send WMI commands in ROAM_HO_FAIL handling
When firmware sends WMI_ROAM_REASON_HO_FAILED event to host,
it has already deleted the peer. Host should not send peer
and vdev cleanup commands to firmware.
Add disassoc_reason field to roamCmd to indicate that CSR wants to
disconnect because of ROAM_HO_FAIL. Copy that information to PE
session, send it to WMA using WMA_DELETE_BSS_HO_FAIL_REQ.
Add wma_delete_bss_ho_fail() to take care of driver state cleanup
without sending commands to firmware.
CRs-Fixed: 1083649
Change-Id: Icdd7571214ea5510c0cdbc44c69d6b5060f5892c
| -rw-r--r-- | core/dp/txrx/ol_txrx_peer_find.c | 2 | ||||
| -rw-r--r-- | core/mac/inc/sir_api.h | 1 | ||||
| -rw-r--r-- | core/mac/src/include/sir_params.h | 4 | ||||
| -rw-r--r-- | core/mac/src/pe/include/lim_session.h | 1 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_assoc_utils.c | 7 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_process_message_queue.c | 2 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_process_sme_req_messages.c | 2 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_send_sme_rsp_messages.c | 7 | ||||
| -rw-r--r-- | core/mac/src/sys/legacy/src/utils/src/mac_trace.c | 2 | ||||
| -rw-r--r-- | core/sme/inc/csr_api.h | 1 | ||||
| -rw-r--r-- | core/sme/inc/csr_internal.h | 2 | ||||
| -rw-r--r-- | core/sme/src/csr/csr_api_roam.c | 12 | ||||
| -rw-r--r-- | core/wma/inc/wma_internal.h | 2 | ||||
| -rw-r--r-- | core/wma/inc/wma_types.h | 2 | ||||
| -rw-r--r-- | core/wma/src/wma_dev_if.c | 140 | ||||
| -rw-r--r-- | core/wma/src/wma_main.c | 4 |
16 files changed, 171 insertions, 20 deletions
diff --git a/core/dp/txrx/ol_txrx_peer_find.c b/core/dp/txrx/ol_txrx_peer_find.c index 12638b04c858..dfd7da2a40a4 100644 --- a/core/dp/txrx/ol_txrx_peer_find.c +++ b/core/dp/txrx/ol_txrx_peer_find.c @@ -402,7 +402,7 @@ static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev, qdf_spin_unlock(&pdev->peer_map_unmap_lock); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH, + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s: peer %p ID %d peer_id[%d] peer_id_ref_cnt %d peer->ref_cnt %d", __func__, peer, peer_id, i, qdf_atomic_read(&pdev-> diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index adb7ebf055d9..9ccfc9179699 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -1390,6 +1390,7 @@ typedef struct sSirSmeDisassocReq { /* This flag tells LIM whether to send the disassoc OTA or not */ /* This will be set in while handing off from one AP to other */ uint8_t doNotSendOverTheAir; + bool process_ho_fail; } qdf_packed tSirSmeDisassocReq, *tpSirSmeDisassocReq; /* / Definition for Tkip countermeasures request */ diff --git a/core/mac/src/include/sir_params.h b/core/mac/src/include/sir_params.h index 738fbd93e0ab..b050354d6501 100644 --- a/core/mac/src/include/sir_params.h +++ b/core/mac/src/include/sir_params.h @@ -253,9 +253,11 @@ typedef struct sSirMbMsgP2p { #define SIR_HAL_TIMER_ADJUST_ADAPTIVE_THRESHOLD_IND \ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 44) #define SIR_HAL_SET_LINK_STATE (SIR_HAL_ITC_MSG_TYPES_BEGIN + 45) +#define SIR_HAL_DELETE_BSS_HO_FAIL_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 46) +#define SIR_HAL_DELETE_BSS_HO_FAIL_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 47) /* - * (SIR_HAL_ITC_MSG_TYPES_BEGIN + 46) to + * (SIR_HAL_ITC_MSG_TYPES_BEGIN + 48) to * (SIR_HAL_ITC_MSG_TYPES_BEGIN + 57) are unused */ diff --git a/core/mac/src/pe/include/lim_session.h b/core/mac/src/pe/include/lim_session.h index c0d7398e642c..4a3b40add9eb 100644 --- a/core/mac/src/pe/include/lim_session.h +++ b/core/mac/src/pe/include/lim_session.h @@ -485,6 +485,7 @@ typedef struct sPESession /* Added to Support BT-AMP */ uint8_t *access_policy_vendor_ie; uint8_t access_policy; bool ignore_assoc_disallowed; + bool process_ho_fail; } 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 b16c83e4e82b..d859282617ed 100644 --- a/core/mac/src/pe/lim/lim_assoc_utils.c +++ b/core/mac/src/pe/lim/lim_assoc_utils.c @@ -3396,7 +3396,12 @@ lim_del_bss(tpAniSirGlobal pMac, tpDphHashNode pStaDs, uint16_t bssIdx, /* we need to defer the message until we get the response back from HAL. */ SET_LIM_PROCESS_DEFD_MESGS(pMac, false); - msgQ.type = WMA_DELETE_BSS_REQ; + lim_log(pMac, LOGW, FL("process_ho_fail = %d"), + psessionEntry->process_ho_fail); + if (psessionEntry->process_ho_fail) + msgQ.type = WMA_DELETE_BSS_HO_FAIL_REQ; + else + msgQ.type = WMA_DELETE_BSS_REQ; msgQ.reserved = 0; msgQ.bodyptr = pDelBssParams; msgQ.bodyval = 0; diff --git a/core/mac/src/pe/lim/lim_process_message_queue.c b/core/mac/src/pe/lim/lim_process_message_queue.c index 381e186d5bb8..b3c3f44723ae 100644 --- a/core/mac/src/pe/lim/lim_process_message_queue.c +++ b/core/mac/src/pe/lim/lim_process_message_queue.c @@ -446,6 +446,7 @@ uint8_t static def_msg_decision(tpAniSirGlobal pMac, tpSirMsgQ limMsg) && !pMac->lim.gLimSystemInScanLearnMode) { if ((limMsg->type != WMA_ADD_BSS_RSP) && (limMsg->type != WMA_DELETE_BSS_RSP) + && (limMsg->type != WMA_DELETE_BSS_HO_FAIL_RSP) && (limMsg->type != WMA_ADD_STA_RSP) && (limMsg->type != WMA_DELETE_STA_RSP) && (limMsg->type != WMA_SET_BSSKEY_RSP) @@ -1763,6 +1764,7 @@ static void lim_process_messages(tpAniSirGlobal mac_ctx, tpSirMsgQ msg) lim_process_mlm_del_sta_rsp(mac_ctx, msg); break; case WMA_DELETE_BSS_RSP: + case WMA_DELETE_BSS_HO_FAIL_RSP: lim_handle_delete_bss_rsp(mac_ctx, msg); break; case WMA_CSA_OFFLOAD_EVENT: diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c index ace88d8a89d0..37a9806dd293 100644 --- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c @@ -2450,6 +2450,8 @@ static void __lim_process_sme_disassoc_req(tpAniSirGlobal pMac, uint32_t *pMsgBu psessionEntry->smeSessionId = smesessionId; psessionEntry->transactionId = smetransactionId; + lim_log(pMac, LOGW, FL("ho_fail: %d "), smeDisassocReq.process_ho_fail); + psessionEntry->process_ho_fail = smeDisassocReq.process_ho_fail; switch (GET_LIM_SYSTEM_ROLE(psessionEntry)) { case eLIM_STA_ROLE: diff --git a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c index 4eae32115abf..7db0325fd3b9 100644 --- a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c +++ b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c @@ -2284,6 +2284,13 @@ void lim_handle_delete_bss_rsp(tpAniSirGlobal pMac, tpSirMsgQ MsgQ) qdf_mem_free(MsgQ->bodyptr); return; } + /* + * During DEL BSS handling, the PE Session will be deleted, but it is + * better to clear this flag if the session is hanging around due + * to some error conditions so that the next DEL_BSS request does + * not take the HO_FAIL path + */ + psessionEntry->process_ho_fail = false; if (LIM_IS_IBSS_ROLE(psessionEntry)) lim_ibss_del_bss_rsp(pMac, MsgQ->bodyptr, psessionEntry); else if (LIM_IS_UNKNOWN_ROLE(psessionEntry)) diff --git a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c index a76e2b49b6e9..63acd730a64f 100644 --- a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c +++ b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c @@ -394,7 +394,9 @@ uint8_t *mac_trace_get_wma_msg_string(uint16_t wma_msg) CASE_RETURN_STRING(WMA_ADD_BSS_REQ); CASE_RETURN_STRING(WMA_ADD_BSS_RSP); CASE_RETURN_STRING(WMA_DELETE_BSS_REQ); + CASE_RETURN_STRING(WMA_DELETE_BSS_HO_FAIL_REQ); CASE_RETURN_STRING(WMA_DELETE_BSS_RSP); + CASE_RETURN_STRING(WMA_DELETE_BSS_HO_FAIL_RSP); CASE_RETURN_STRING(WMA_SEND_BEACON_REQ); CASE_RETURN_STRING(WMA_SET_BSSKEY_REQ); CASE_RETURN_STRING(WMA_SET_BSSKEY_RSP); diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index 4cf951f67506..261d0e3de6e9 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -649,6 +649,7 @@ typedef enum { eCSR_DISCONNECT_REASON_IBSS_LEAVE, eCSR_DISCONNECT_REASON_STA_HAS_LEFT, eCSR_DISCONNECT_REASON_NDI_DELETE, + eCSR_DISCONNECT_REASON_ROAM_HO_FAIL, } eCsrRoamDisconnectReason; typedef enum { diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h index a9e1896c1641..835d352f5c50 100644 --- a/core/sme/inc/csr_internal.h +++ b/core/sme/inc/csr_internal.h @@ -406,6 +406,7 @@ typedef struct tagRoamCmd { bool fStopWds; tSirMacAddr peerMac; tSirMacReasonCodes reason; + eCsrRoamDisconnectReason disconnect_reason; } tRoamCmd; typedef struct tagSetKeyCmd { @@ -1000,6 +1001,7 @@ typedef struct tagCsrRoamSession { bool supported_nss_1x1; bool disable_hi_rssi; bool dhcp_done; + uint8_t disconnect_reason; } tCsrRoamSession; typedef struct tagCsrRoamStruct { diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index d9bbd0bda24d..68a879b7e53b 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -5670,6 +5670,8 @@ QDF_STATUS csr_roam_process_command(tpAniSirGlobal pMac, tSmeCmd *pCommand) sms_log(pMac, LOG1, FL("Roam Reason : %d, sessionId: %d"), pCommand->u.roamCmd.roamReason, sessionId); + pSession->disconnect_reason = pCommand->u.roamCmd.disconnect_reason; + switch (pCommand->u.roamCmd.roamReason) { case eCsrForcedDisassoc: if (eCSR_ROAMING_STATE_IDLE == pMac->roam.curState[sessionId]) { @@ -5678,7 +5680,6 @@ QDF_STATUS csr_roam_process_command(tpAniSirGlobal pMac, tSmeCmd *pCommand) " %d"), eCSR_ROAMING_STATE_IDLE); return QDF_STATUS_E_FAILURE; } - status = csr_roam_process_disassoc_deauth(pMac, pCommand, true, false); csr_free_roam_profile(pMac, sessionId); @@ -8218,6 +8219,9 @@ QDF_STATUS csr_roam_issue_disassociate_cmd(tpAniSirGlobal pMac, uint32_t session case eCSR_DISCONNECT_REASON_DISASSOC: pCommand->u.roamCmd.roamReason = eCsrForcedDisassoc; break; + case eCSR_DISCONNECT_REASON_ROAM_HO_FAIL: + pCommand->u.roamCmd.roamReason = eCsrForcedDisassoc; + break; case eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE: pCommand->u.roamCmd.roamReason = eCsrSmeIssuedIbssJoinFailure; @@ -8239,6 +8243,7 @@ QDF_STATUS csr_roam_issue_disassociate_cmd(tpAniSirGlobal pMac, uint32_t session default: break; } + pCommand->u.roamCmd.disconnect_reason = reason; status = csr_queue_sme_command(pMac, pCommand, true); if (!QDF_IS_STATUS_SUCCESS(status)) { sms_log(pMac, LOGE, @@ -14561,6 +14566,8 @@ QDF_STATUS csr_send_mb_disassoc_req_msg(tpAniSirGlobal pMac, uint32_t sessionId, bssId, QDF_MAC_ADDR_SIZE); } pMsg->reasonCode = reasonCode; + pMsg->process_ho_fail = (pSession->disconnect_reason == + eCSR_DISCONNECT_REASON_ROAM_HO_FAIL) ? true : false; /* * The state will be DISASSOC_HANDOFF only when we are doing * handoff. Here we should not send the disassoc over the air @@ -18877,7 +18884,8 @@ void csr_process_ho_fail_ind(tpAniSirGlobal pMac, void *pMsgBuf) eCSR_REASON_ROAM_HO_FAIL); QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "LFR3:Issue Disconnect on session %d", sessionId); - csr_roam_disconnect(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED); + csr_roam_disconnect(pMac, sessionId, + eCSR_DISCONNECT_REASON_ROAM_HO_FAIL); } #endif /* WLAN_FEATURE_ROAM_OFFLOAD */ diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h index a5a6aae39297..67579e0b06b8 100644 --- a/core/wma/inc/wma_internal.h +++ b/core/wma/inc/wma_internal.h @@ -597,6 +597,8 @@ int32_t wma_find_vdev_by_type(tp_wma_handle wma, int32_t type); void wma_set_vdev_intrabss_fwd(tp_wma_handle wma_handle, tpDisableIntraBssFwd pdis_intra_fwd); +void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params); + /* * wma_mgmt.c functions declarations */ diff --git a/core/wma/inc/wma_types.h b/core/wma/inc/wma_types.h index 4818795c3e1f..cfd4d2ffb520 100644 --- a/core/wma/inc/wma_types.h +++ b/core/wma/inc/wma_types.h @@ -145,7 +145,9 @@ #define WMA_ADD_BSS_REQ SIR_HAL_ADD_BSS_REQ #define WMA_ADD_BSS_RSP SIR_HAL_ADD_BSS_RSP #define WMA_DELETE_BSS_REQ SIR_HAL_DELETE_BSS_REQ +#define WMA_DELETE_BSS_HO_FAIL_REQ SIR_HAL_DELETE_BSS_HO_FAIL_REQ #define WMA_DELETE_BSS_RSP SIR_HAL_DELETE_BSS_RSP +#define WMA_DELETE_BSS_HO_FAIL_RSP SIR_HAL_DELETE_BSS_HO_FAIL_RSP #define WMA_SEND_BEACON_REQ SIR_HAL_SEND_BEACON_REQ #define WMA_SEND_PROBE_RSP_TMPL SIR_HAL_SEND_PROBE_RSP_TMPL diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index fbb7aa9e2b0e..f5a1fd5368bb 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -1053,7 +1053,7 @@ QDF_STATUS wma_set_peer_param(void *wma_ctx, uint8_t *peer_addr, } /** - * wma_remove_peer() - send remove peer command to fw + * wma_remove_peer() - remove peer information from host driver and fw * @wma: wma handle * @bssid: mac address * @vdev_id: vdev id @@ -1104,7 +1104,7 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid, param.peer_tid_bitmap = peer_tid_bitmap; param.vdev_id = vdev_id; wmi_unified_peer_flush_tids_send(wma->wmi_handle, bssid, - ¶m); + ¶m); if (wma_is_vdev_in_ibss_mode(wma, vdev_id)) { WMA_LOGD("%s: bssid %pM peer->mac_addr %pM", __func__, @@ -1112,7 +1112,8 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid, peer_addr = peer_mac_addr; } - wmi_unified_peer_delete_send(wma->wmi_handle, peer_addr, vdev_id); + wmi_unified_peer_delete_send(wma->wmi_handle, peer_addr, + vdev_id); #undef PEER_ALL_TID_BITMASK } @@ -4226,6 +4227,109 @@ void wma_delete_sta(tp_wma_handle wma, tpDeleteStaParams del_sta) } /** + * wma_delete_bss_ho_fail() - process delete bss request for handoff failure + * @wma: wma handle + * @params: del bss parameters + * + * Delete BSS in case of ROAM_HO_FAIL processing is handled separately in + * this routine. It needs to be done without sending any commands to firmware + * because firmware has already stopped and deleted peer and vdev is down. + * Relevent logic is aggregated from other routines. It changes the host + * data structures without sending VDEV_STOP, PEER_FLUSH_TIDS, PEER_DELETE + * and VDEV_DOWN commands to firmware. + * + * Return: none + */ +void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params) +{ + ol_txrx_pdev_handle pdev; + ol_txrx_peer_handle peer = NULL; + QDF_STATUS status = QDF_STATUS_SUCCESS; + uint8_t peer_id; + ol_txrx_vdev_handle txrx_vdev = NULL; + struct wma_txrx_node *iface; + + pdev = cds_get_context(QDF_MODULE_ID_TXRX); + + if (NULL == pdev) { + WMA_LOGE("%s:Unable to get TXRX context", __func__); + goto fail_del_bss_ho_fail; + } + 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); + status = QDF_STATUS_E_FAILURE; + goto fail_del_bss_ho_fail; + } + + iface = &wma->interfaces[params->smesessionId]; + if (!iface || !iface->handle) { + WMA_LOGE("%s vdev id %d is already deleted", + __func__, params->smesessionId); + goto fail_del_bss_ho_fail; + } + qdf_mem_zero(iface->bssid, IEEE80211_ADDR_LEN); + + txrx_vdev = wma_find_vdev_by_id(wma, params->smesessionId); + if (!txrx_vdev) { + WMA_LOGE("%s:Invalid vdev handle", __func__); + status = QDF_STATUS_E_FAILURE; + goto fail_del_bss_ho_fail; + } + + /* Free the allocated stats response buffer for the the session */ + if (iface->stats_rsp) { + qdf_mem_free(iface->stats_rsp); + iface->stats_rsp = NULL; + } + + if (iface->psnr_req) { + qdf_mem_free(iface->psnr_req); + iface->psnr_req = NULL; + } + qdf_mem_zero(&iface->ns_offload_req, + sizeof(iface->ns_offload_req)); + qdf_mem_zero(&iface->arp_offload_req, + sizeof(iface->arp_offload_req)); + + WMA_LOGD("%s, vdev_id: %d, pausing tx_ll_queue for VDEV_STOP (del_bss)", + __func__, params->smesessionId); + ol_txrx_vdev_pause(iface->handle, + OL_TXQ_PAUSE_REASON_VDEV_STOP); + iface->pause_bitmap |= (1 << PAUSE_TYPE_HOST); + + ol_txrx_vdev_flush(iface->handle); + WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for VDEV_STOP rsp", + __func__, params->smesessionId); + ol_txrx_vdev_unpause(iface->handle, + OL_TXQ_PAUSE_REASON_VDEV_STOP); + iface->pause_bitmap &= ~(1 << PAUSE_TYPE_HOST); + qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED); + WMA_LOGD("%s: (type %d subtype %d) BSS is stopped", + __func__, iface->type, iface->sub_type); + iface->vdev_up = false; + params->status = QDF_STATUS_SUCCESS; + if (!iface->peer_count) { + WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d", + __func__, params->bssid, params->smesessionId, + iface->peer_count); + goto fail_del_bss_ho_fail; + } + + if (peer) + ol_txrx_peer_detach(peer); + iface->peer_count--; + WMA_LOGE("%s: Removed peer %p with peer_addr %pM vdevid %d peer_count %d", + __func__, peer, params->bssid, params->smesessionId, + iface->peer_count); +fail_del_bss_ho_fail: + params->status = status; + wma_send_msg(wma, WMA_DELETE_BSS_HO_FAIL_RSP, (void *)params, 0); +} + +/** * wma_delete_bss() - process delete bss request from upper layer * @wma: wma handle * @params: del bss parameters @@ -4242,6 +4346,7 @@ void wma_delete_bss(tp_wma_handle wma, tpDeleteBssParams params) uint8_t max_wait_iterations = 0; ol_txrx_vdev_handle txrx_vdev = NULL; bool roam_synch_in_progress = false; + struct wma_txrx_node *iface; pdev = cds_get_context(QDF_MODULE_ID_TXRX); @@ -4280,15 +4385,21 @@ void wma_delete_bss(tp_wma_handle wma, tpDeleteBssParams params) goto out; } + iface = &wma->interfaces[params->smesessionId]; + if (!iface || !iface->handle) { + WMA_LOGE("%s vdev id %d is already deleted", + __func__, params->smesessionId); + goto out; + } /*Free the allocated stats response buffer for the the session */ - if (wma->interfaces[params->smesessionId].stats_rsp) { - qdf_mem_free(wma->interfaces[params->smesessionId].stats_rsp); - wma->interfaces[params->smesessionId].stats_rsp = NULL; + if (iface->stats_rsp) { + qdf_mem_free(iface->stats_rsp); + iface->stats_rsp = NULL; } - if (wma->interfaces[params->smesessionId].psnr_req) { - qdf_mem_free(wma->interfaces[params->smesessionId].psnr_req); - wma->interfaces[params->smesessionId].psnr_req = NULL; + if (iface->psnr_req) { + qdf_mem_free(iface->psnr_req); + iface->psnr_req = NULL; } if (wlan_op_mode_ibss == ol_txrx_get_opmode(txrx_vdev)) @@ -4298,7 +4409,7 @@ void wma_delete_bss(tp_wma_handle wma, tpDeleteBssParams params) roam_synch_in_progress = true; WMA_LOGD("LFR3:%s: Setting vdev_up to FALSE for session %d", __func__, params->smesessionId); - wma->interfaces[params->smesessionId].vdev_up = false; + iface->vdev_up = false; goto detach_peer; } msg = wma_fill_vdev_req(wma, params->smesessionId, WMA_DELETE_BSS_REQ, @@ -4332,18 +4443,17 @@ void wma_delete_bss(tp_wma_handle wma, tpDeleteBssParams params) WMA_LOGD("%s, vdev_id: %d, pausing tx_ll_queue for VDEV_STOP (del_bss)", __func__, params->smesessionId); - ol_txrx_vdev_pause(wma->interfaces[params->smesessionId].handle, + ol_txrx_vdev_pause(iface->handle, OL_TXQ_PAUSE_REASON_VDEV_STOP); - wma->interfaces[params->smesessionId].pause_bitmap |= - (1 << PAUSE_TYPE_HOST); + iface->pause_bitmap |= (1 << PAUSE_TYPE_HOST); if (wmi_unified_vdev_stop_send(wma->wmi_handle, params->smesessionId)) { WMA_LOGP("%s: %d Failed to send vdev stop", __func__, __LINE__); wma_remove_vdev_req(wma, params->smesessionId, - WMA_TARGET_REQ_TYPE_VDEV_STOP); + WMA_TARGET_REQ_TYPE_VDEV_STOP); status = QDF_STATUS_E_FAILURE; goto detach_peer; - } + } WMA_LOGD("%s: bssid %pM vdev_id %d", __func__, params->bssid, params->smesessionId); return; diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 06c2ba198a1b..bae962e80a3b 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -6198,6 +6198,10 @@ QDF_STATUS wma_mc_process_msg(void *cds_context, cds_msg_t *msg) case WMA_DELETE_STA_REQ: wma_delete_sta(wma_handle, (tpDeleteStaParams) msg->bodyptr); break; + case WMA_DELETE_BSS_HO_FAIL_REQ: + wma_delete_bss_ho_fail(wma_handle, + (tpDeleteBssParams) msg->bodyptr); + break; case WMA_DELETE_BSS_REQ: wma_delete_bss(wma_handle, (tpDeleteBssParams) msg->bodyptr); break; |
