diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 40aab9eee4c4..ce8a234e16f5 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -4032,12 +4032,17 @@ void ipa3_q6_pre_shutdown_cleanup(void) ipa3_q6_pipe_delay(true); ipa3_q6_avoid_holb(); + + if (ipa3_ctx->ipa_hw_type == IPA_HW_v4_11) + ipa3_set_reset_client_cons_pipe_sus_holb(true, 0, + IPA_CLIENT_USB_CONS); + if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_0) { prod = true; ipa3_halt_q6_gsi_channels(prod); } if (ipa3_ctx->ipa_config_is_mhi) - ipa3_set_reset_client_cons_pipe_sus_holb(true, + ipa3_set_reset_client_cons_pipe_sus_holb(true, 0, IPA_CLIENT_MHI_CONS); if (ipa3_q6_clean_q6_tables()) { IPAERR("Failed to clean Q6 tables\n"); @@ -4095,6 +4100,9 @@ void ipa3_q6_post_shutdown_cleanup(void) /* Handle the issue where SUSPEND was removed for some reason */ ipa3_q6_avoid_holb(); + if (ipa3_ctx->ipa_hw_type == IPA_HW_v4_11) + ipa3_set_reset_client_cons_pipe_sus_holb(true, + IPA_HOLB_TMR_VAL_4_5, IPA_CLIENT_USB_CONS); /* halt both prod and cons channels starting at IPAv4 */ if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_0) { IPA_ACTIVE_CLIENTS_DEC_SIMPLE(); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_client.c b/drivers/platform/msm/ipa/ipa_v3/ipa_client.c index 4d68b06a95ae..9c92fd487e6e 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_client.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_client.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. */ #include @@ -62,11 +62,19 @@ int ipa3_enable_data_path(u32 clnt_hdl) * on other end from IPA hw. */ if ((ep->client == IPA_CLIENT_USB_DPL_CONS) || - (ep->client == IPA_CLIENT_MHI_DPL_CONS)) + (ep->client == IPA_CLIENT_MHI_DPL_CONS)) { + holb_cfg.tmr_val = 0; holb_cfg.en = IPA_HOLB_TMR_EN; - else + } else if (ipa3_ctx->ipa_hw_type == IPA_HW_v4_11 && + (ep->client == IPA_CLIENT_WLAN1_CONS || + ep->client == IPA_CLIENT_USB_CONS)) { + holb_cfg.en = IPA_HOLB_TMR_EN; + holb_cfg.tmr_val = IPA_HOLB_TMR_VAL_4_5; + } + else { holb_cfg.en = IPA_HOLB_TMR_DIS; - holb_cfg.tmr_val = 0; + holb_cfg.tmr_val = 0; + } res = ipa3_cfg_ep_holb(clnt_hdl, &holb_cfg); } @@ -1441,7 +1449,7 @@ int ipa3_start_stop_client_prod_gsi_chnl(enum ipa_client_type client, client_lock_unlock_cb(client, false); return result; } -int ipa3_set_reset_client_cons_pipe_sus_holb(bool set_reset, +int ipa3_set_reset_client_cons_pipe_sus_holb(bool set_reset, u32 tmr_val, enum ipa_client_type client) { int pipe_idx; @@ -1453,7 +1461,7 @@ int ipa3_set_reset_client_cons_pipe_sus_holb(bool set_reset, memset(&ep_holb, 0, sizeof(ep_holb)); ep_suspend.ipa_ep_suspend = set_reset; - ep_holb.tmr_val = 0; + ep_holb.tmr_val = tmr_val; ep_holb.en = set_reset; if (IPA_CLIENT_IS_PROD(client)) { @@ -1560,8 +1568,6 @@ int ipa3_xdci_disconnect(u32 clnt_hdl, bool should_force_clear, u32 qmi_req_id) if (!ep->keep_ipa_awake) IPA_ACTIVE_CLIENTS_INC_EP(ipa3_get_client_mapping(clnt_hdl)); - ipa3_disable_data_path(clnt_hdl); - if (!IPA_CLIENT_IS_CONS(ep->client)) { IPADBG("Stopping PROD channel - hdl=%d clnt=%d\n", clnt_hdl, ep->client); @@ -1585,6 +1591,7 @@ int ipa3_xdci_disconnect(u32 clnt_hdl, bool should_force_clear, u32 qmi_req_id) goto stop_chan_fail; } } + ipa3_disable_data_path(clnt_hdl); IPA_ACTIVE_CLIENTS_DEC_EP(ipa3_get_client_mapping(clnt_hdl)); IPADBG("exit\n"); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index a8b1094a8a1f..4e18b621333d 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -2492,7 +2492,7 @@ int ipa3_start_stop_client_prod_gsi_chnl(enum ipa_client_type client, void ipa3_client_prod_post_shutdown_cleanup(void); -int ipa3_set_reset_client_cons_pipe_sus_holb(bool set_reset, +int ipa3_set_reset_client_cons_pipe_sus_holb(bool set_reset, u32 tmr_val, enum ipa_client_type client); int ipa3_xdci_suspend(u32 ul_clnt_hdl, u32 dl_clnt_hdl,