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: