From 9851bcda0387d41524ef8ec0beaccf06e384172d Mon Sep 17 00:00:00 2001 From: Pragaspathi Thilagaraj Date: Mon, 27 Apr 2020 12:33:38 +0530 Subject: [PATCH] qcacld-3.0: Prevent RSO stop sent after vdev down When roam invoke from user space fails, internal disconnection is triggered from csr. This queues disassociate command to lim and then RSO command is also posted to lim. When disassociate get processed, vdev down is sent, pe session is deleted and roam offload flag at wma is cleared. When RSO stop is received at wma, the roam offload flag is cleared and wma returns failure without sending RSO command. So in STA+STA scenario, after disconnection on 1st sta, roaming will be enabled on 2nd sta, but since RSO stop was not sent on 1st sta, firmware will assert as btm offload is not disabled at the 1st STA. Disable roaming first, followed by vdev stop/vdev down to firmware. Change-Id: I3f2f873cf50536b6f31bc0113ff737d6d95a520d CRs-Fixed: 2672573 --- core/sme/src/common/sme_api.c | 7 +++---- core/sme/src/csr/csr_api_roam.c | 28 +++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 6f4261e40851..c9b7f8d7a271 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -6538,10 +6538,9 @@ QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t session_id, return QDF_STATUS_E_FAILURE; } - if (reason == REASON_DRIVER_DISABLED && requestor) { - mlme_set_operations_bitmap(mac_ctx->psoc, session_id, requestor, - false); - } + if (reason == REASON_DRIVER_DISABLED && requestor) + mlme_set_operations_bitmap(mac_ctx->psoc, session_id, + requestor, false); status = csr_post_roam_state_change(mac_ctx, session_id, ROAM_RSO_STOPPED, diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 10b751675d81..49ec805a7739 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -9305,6 +9305,20 @@ QDF_STATUS csr_roam_disconnect_internal(struct mac_context *mac, uint32_t sessio return status; } +#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD) +static void +csr_disable_roaming_offload(struct mac_context *mac_ctx, uint32_t vdev_id) +{ + sme_stop_roaming(MAC_HANDLE(mac_ctx), vdev_id, + REASON_DRIVER_DISABLED, + RSO_INVALID_REQUESTOR); +} +#else +static inline void +csr_disable_roaming_offload(struct mac_context *mac_ctx, uint32_t session_id) +{} +#endif + QDF_STATUS csr_roam_disconnect(struct mac_context *mac_ctx, uint32_t session_id, eCsrRoamDisconnectReason reason, tSirMacReasonCodes mac_reason) @@ -9317,7 +9331,10 @@ QDF_STATUS csr_roam_disconnect(struct mac_context *mac_ctx, uint32_t session_id, } session->discon_in_progress = true; + csr_roam_cancel_roaming(mac_ctx, session_id); + csr_disable_roaming_offload(mac_ctx, session_id); + csr_roam_remove_duplicate_command(mac_ctx, session_id, NULL, eCsrForcedDisassoc); @@ -21701,13 +21718,14 @@ static QDF_STATUS csr_process_roam_sync_callback(struct mac_context *mac_ctx, case SIR_ROAMING_INVOKE_FAIL: sme_debug("Roaming triggered failed source %d nud behaviour %d", vdev_roam_params->source, mac_ctx->nud_fail_behaviour); + + /* Userspace roam req fail, disconnect with AP */ if (vdev_roam_params->source == USERSPACE_INITIATED || - mac_ctx->nud_fail_behaviour == DISCONNECT_AFTER_ROAM_FAIL) { - /* Userspace roam req fail, disconnect with AP */ + mac_ctx->nud_fail_behaviour == DISCONNECT_AFTER_ROAM_FAIL) csr_roam_disconnect(mac_ctx, session_id, - eCSR_DISCONNECT_REASON_DEAUTH, - eSIR_MAC_USER_TRIGGERED_ROAM_FAILURE); - } + eCSR_DISCONNECT_REASON_DEAUTH, + eSIR_MAC_USER_TRIGGERED_ROAM_FAILURE); + vdev_roam_params->roam_invoke_in_progress = false; goto end; case SIR_ROAM_SYNCH_PROPAGATION: