From 959ac03d073b1f25a530965a812c7bdbecc6dc7e Mon Sep 17 00:00:00 2001 From: Vevek Venkatesan Date: Tue, 26 Nov 2019 16:52:52 +0530 Subject: [PATCH] qcacld-3.0: setup IPA sys pipes if wlan_ipa_wdi_init succeeds At present, IPA sys pipes setup done before wlan_ipa_wdi_init, so chances for IPA uC is not yet up and running. As wdi init succeeds only if uC is up and running, setting up IPA sys pipes after wlan_ipa_wdi_init succeeds. Change-Id: I7dcae49db0b0a2114908284379096f39e6f16a50 CRs-Fixed: 2573929 --- components/ipa/core/src/wlan_ipa_core.c | 48 +++++++++++++++++-------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/components/ipa/core/src/wlan_ipa_core.c b/components/ipa/core/src/wlan_ipa_core.c index fcc62bea4f5d..7ee94811b2b0 100644 --- a/components/ipa/core/src/wlan_ipa_core.c +++ b/components/ipa/core/src/wlan_ipa_core.c @@ -3020,27 +3020,33 @@ QDF_STATUS wlan_ipa_setup(struct wlan_ipa_priv *ipa_ctx, qdf_atomic_set(&ipa_ctx->pipes_disabled, 1); qdf_atomic_set(&ipa_ctx->autonomy_disabled, 1); ipa_ctx->wdi_enabled = false; - /* Setup IPA system pipes */ - if (wlan_ipa_uc_sta_is_enabled(ipa_ctx->config)) { - ret = wlan_ipa_setup_sys_pipe(ipa_ctx); - if (ret) - goto fail_create_sys_pipe; - - qdf_create_work(0, &ipa_ctx->mcc_work, - wlan_ipa_mcc_work_handler, ipa_ctx); - } status = wlan_ipa_wdi_init(ipa_ctx); - if (status == QDF_STATUS_E_BUSY) - status = wlan_ipa_uc_send_wdi_control_msg(false); - if (status != QDF_STATUS_SUCCESS) { + if (status == QDF_STATUS_SUCCESS) { + /* Setup IPA system pipes */ + if (wlan_ipa_uc_sta_is_enabled(ipa_ctx->config)) { + ret = wlan_ipa_setup_sys_pipe(ipa_ctx); + if (ret) + goto ipa_wdi_destroy; + + qdf_create_work(0, &ipa_ctx->mcc_work, + wlan_ipa_mcc_work_handler, + ipa_ctx); + } + } else if (status == QDF_STATUS_E_BUSY) { + ret = wlan_ipa_uc_send_wdi_control_msg(false); + if (ret) { + ipa_err("IPA WDI msg send failed: ret=%d", ret); + goto ipa_wdi_destroy; + } + } else { ipa_err("IPA WDI init failed: ret=%d", status); - goto fail_create_sys_pipe; + goto ipa_wdi_destroy; } } else { ret = wlan_ipa_setup_sys_pipe(ipa_ctx); if (ret) - goto fail_create_sys_pipe; + goto ipa_wdi_destroy; } qdf_event_create(&ipa_ctx->ipa_resource_comp); @@ -3049,7 +3055,7 @@ QDF_STATUS wlan_ipa_setup(struct wlan_ipa_priv *ipa_ctx, return QDF_STATUS_SUCCESS; -fail_create_sys_pipe: +ipa_wdi_destroy: wlan_ipa_wdi_destroy_rm(ipa_ctx); fail_setup_rm: @@ -3212,6 +3218,18 @@ static void wlan_ipa_uc_loaded_handler(struct wlan_ipa_priv *ipa_ctx) ipa_err("qdf_dev is null"); return; } + + if (wlan_ipa_uc_sta_is_enabled(ipa_ctx->config)) { + /* Setup IPA system pipes */ + status = wlan_ipa_setup_sys_pipe(ipa_ctx); + if (status) { + ipa_err("Fail to setup sys pipes (status=%d)", status); + return; + } + qdf_create_work(0, &ipa_ctx->mcc_work, + wlan_ipa_mcc_work_handler, ipa_ctx); + } + /* Connect pipe */ status = wlan_ipa_wdi_setup(ipa_ctx, qdf_dev); if (status) {