From c87ebb5ca3a0173fc6261ca795a6adfa70ea3ff5 Mon Sep 17 00:00:00 2001 From: Jianmin Zhu Date: Thu, 23 Apr 2020 17:19:10 +0800 Subject: [PATCH] qcacld-3.0: Host roam failed when need hw mode change On Genoa, when 2G SAP exist, when STA roam from 2G to 5G by LFR2, hardware mode need switch from single MAC mode to dbs mode. Since disconnect current AP happens before reassociate, in hw mode response handler, found original AP disconnected already on host side, then don't reassoc new AP, it's regression of Change-Id: I794c6bf3f749bba9c339fd18b5202d50091b73a7. Fix: In hw mode response handler, don't check connect state of current AP when reassoc new AP. If found disconnect pending during host roaming, don't reassoc. Add debug log when error happens. Change-Id: Id836ac84a4156e9db28f6892c8c9eb5210dfb6e0 CRs-Fixed: 2668869 --- core/sme/src/csr/csr_api_roam.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 868c5bfe8038..b4db5044459e 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -10389,6 +10389,7 @@ QDF_STATUS csr_roam_lfr2_issue_connect(struct mac_context *mac, qdf_mem_free(cur_roam_profile); return QDF_STATUS_SUCCESS; } else { + sme_err("malloc failed"); QDF_ASSERT(0); csr_dequeue_command(mac); } @@ -10404,18 +10405,18 @@ QDF_STATUS csr_continue_lfr2_connect(struct mac_context *mac, QDF_STATUS status = QDF_STATUS_E_FAILURE; roam_info = qdf_mem_malloc(sizeof(*roam_info)); - if (!roam_info) + if (!roam_info) { + sme_err("malloc failed"); return QDF_STATUS_E_NOMEM; - + } scan_handle_roam_ap = mac->roam.neighborRoamInfo[session_id].scan_res_lfr2_roam_ap; - if (!scan_handle_roam_ap) + if (!scan_handle_roam_ap) { + sme_err("no roam target ap"); goto POST_ROAM_FAILURE; - - if ((mac->roam.roamSession[session_id].connectState == - eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED) || - (mac->roam.roamSession[session_id].connectState == - eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTING)) { + } + if(is_disconnect_pending(mac, session_id)) { + sme_err("disconnect pending"); goto purge_scan_result; }