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
This commit is contained in:
Pragaspathi Thilagaraj
2020-04-27 12:33:38 +05:30
کامیت شده توسط nshrivas
والد 5811526f4a
کامیت 9851bcda03
2فایلهای تغییر یافته به همراه26 افزوده شده و 9 حذف شده

مشاهده پرونده

@@ -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,

مشاهده پرونده

@@ -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: