From 57de52771dff53b96c2547ae244a97a8d8ace2d5 Mon Sep 17 00:00:00 2001 From: Pragaspathi Thilagaraj Date: Wed, 16 Oct 2019 15:51:51 +0530 Subject: [PATCH] qcacld-3.0: Send RSO stop for supplicant disabled roam If supplicant disabled roaming, driver does not send RSO cmd to fw. This causes roam invoke to fail in FW since RSO start never happened at least once to configure roaming engine in FW. So when supplicant disabled roaming on a vdev, send RSO start on the vdev and then follow it with RSO stop command. So when supplicant disabled roaming, disable the firmware roam scans alone and allow roam invoke. Change-Id: Ic3def72c6b60c42269d99e6db30cf3bfd1988d70 CRs-Fixed: 2543865 --- core/sme/src/csr/csr_api_roam.c | 41 +++++++++++++--------------- core/sme/src/csr/csr_neighbor_roam.c | 18 ------------ 2 files changed, 19 insertions(+), 40 deletions(-) diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index c518b4af9adb..ba2a71fc4b94 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -19400,7 +19400,6 @@ csr_is_adaptive_11r_roam_supported(struct mac_context *mac_ctx, QDF_STATUS csr_post_rso_stop(struct mac_context *mac, uint8_t vdev_id, uint16_t reason) { - struct scheduler_msg sch_msg = {0}; QDF_STATUS status; struct roam_offload_scan_req *req; tpCsrNeighborRoamControlInfo roam_info; @@ -19423,6 +19422,8 @@ csr_post_rso_stop(struct mac_context *mac, uint8_t vdev_id, uint16_t reason) if (reason == REASON_DRIVER_DISABLED) req->reason = REASON_ROAM_STOP_ALL; + else if (reason == REASON_SUPPLICANT_DISABLED_ROAMING) + req->reason = REASON_SUPPLICANT_DISABLED_ROAMING; else req->reason = REASON_SME_ISSUED; @@ -19432,21 +19433,13 @@ csr_post_rso_stop(struct mac_context *mac, uint8_t vdev_id, uint16_t reason) csr_roam_reset_roam_params(mac); /* - * Disable offload_11k_params for current - * vdev + * Disable offload_11k_params for current vdev */ req->offload_11k_params.vdev_id = vdev_id; - sch_msg.type = WMA_ROAM_SCAN_OFFLOAD_REQ; - sch_msg.bodyptr = req; - - status = scheduler_post_message(QDF_MODULE_ID_SME, - QDF_MODULE_ID_WMA, - QDF_MODULE_ID_WMA, - &sch_msg); + status = csr_roam_send_rso_cmd(mac, vdev_id, req); if (QDF_IS_STATUS_ERROR(status)) { - sme_err("ROAM: Post RSO stop to WMA failed, vdev_id: %d", - vdev_id); + sme_err("ROAM: Post RSO stop failed, vdev_id: %d", vdev_id); qdf_mem_zero(req, sizeof(*req)); qdf_mem_free(req); return QDF_STATUS_E_FAULT; @@ -19565,15 +19558,6 @@ csr_roam_switch_to_rso_start(struct mac_context *mac, uint8_t vdev_id, return QDF_STATUS_E_FAILURE; } - /* TODO: Check if we can map the below flag to above bitmap */ - sup_disabled_roaming = mlme_get_supplicant_disabled_roaming(mac->psoc, - vdev_id); - if (sup_disabled_roaming) { - sme_debug("ROAM: RSO Disabled by Supplicant on vdev[%d]", - vdev_id); - return QDF_STATUS_E_FAILURE; - } - status = csr_roam_offload_scan(mac, vdev_id, ROAM_SCAN_OFFLOAD_START, reason); if (QDF_IS_STATUS_ERROR(status)) { @@ -19582,7 +19566,20 @@ csr_roam_switch_to_rso_start(struct mac_context *mac, uint8_t vdev_id, } mlme_set_roam_state(mac->psoc, vdev_id, ROAM_RSO_STARTED); - return QDF_STATUS_SUCCESS; + /* + * If supplicant disabled roaming, driver does not send + * RSO cmd to fw. This causes roam invoke to fail in FW + * since RSO start never happened at least once to + * configure roaming engine in FW. + */ + sup_disabled_roaming = mlme_get_supplicant_disabled_roaming(mac->psoc, + vdev_id); + if (!sup_disabled_roaming) + return QDF_STATUS_SUCCESS; + + sme_debug("ROAM: RSO disabled by Supplicant on vdev[%d]", vdev_id); + return csr_post_roam_state_change(mac, vdev_id, ROAM_RSO_STOPPED, + REASON_SUPPLICANT_DISABLED_ROAMING); } static QDF_STATUS diff --git a/core/sme/src/csr/csr_neighbor_roam.c b/core/sme/src/csr/csr_neighbor_roam.c index c321156a5011..572cc8c2e80e 100644 --- a/core/sme/src/csr/csr_neighbor_roam.c +++ b/core/sme/src/csr/csr_neighbor_roam.c @@ -904,8 +904,6 @@ static void csr_neighbor_roam_info_ctx_init(struct mac_context *mac, &mac->roam.neighborRoamInfo[session_id]; struct csr_roam_session *session = &mac->roam.roamSession[session_id]; int init_ft_flag = false; - bool supplicant_disabled_roaming; - uint8_t reason; csr_init_occupied_channels_list(mac, session_id); csr_neighbor_roam_state_transition(mac, @@ -995,26 +993,10 @@ static void csr_neighbor_roam_info_ctx_init(struct mac_context *mac, } else #endif { - /* - * If supplicant disabled roaming, driver does not send - * RSO cmd to fw. This causes roam invoke to fail in FW - * since RSO start never happened at least once to - * configure roaming engine in FW. - */ csr_post_roam_state_change(mac, session_id, ROAM_RSO_STARTED, REASON_CTX_INIT); - supplicant_disabled_roaming = - mlme_get_supplicant_disabled_roaming( - mac->psoc, session_id); - if (supplicant_disabled_roaming) { - reason = REASON_SUPPLICANT_DISABLED_ROAMING; - sme_debug("ROAM: Supplicant has disabled roaming"); - csr_post_roam_state_change(mac, session_id, - ROAM_RSO_STOPPED, - reason); - } } } }