From 52eb4e3564de48b662a6ade21d7a5c913d68e656 Mon Sep 17 00:00:00 2001 From: Piyush Dhyani Date: Tue, 16 Mar 2021 11:44:06 +0530 Subject: [PATCH 1/2] msm: ipa3: Update holb config on WLAN & USB CONS ep. After configuring WLAN CONS ep or USB ep there is a chance of IPA hardware stall, if WLAN ep or USB ep is not pulling data fast enough. So, set holb on WLAN CONS ep and USB CONS ep to avoid stall. Change-Id: I370165ce197181eaac999df2d8abea517c9e9bd4 Signed-off-by: Piyush Dhyani --- drivers/platform/msm/ipa/ipa_v3/ipa_client.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_client.c b/drivers/platform/msm/ipa/ipa_v3/ipa_client.c index 4d68b06a95ae..1c147721f67e 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); } @@ -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"); From ad284c7b5f4f7b8c11c4a606db671eeb717711d3 Mon Sep 17 00:00:00 2001 From: Ashok Vuyyuru Date: Mon, 5 Apr 2021 19:38:58 +0530 Subject: [PATCH 2/2] msm: ipa3: configure the HOLB timer value to zero in SSR scenario configure the HOLB timer value to zero in SSR scenario to avoid USB stall issue. Change-Id: I23f91c4a2bff2cb3b330d4354e81acc9460d1936 Signed-off-by: Ashok Vuyyuru --- drivers/platform/msm/ipa/ipa_v3/ipa.c | 10 +++++++++- drivers/platform/msm/ipa/ipa_v3/ipa_client.c | 4 ++-- drivers/platform/msm/ipa/ipa_v3/ipa_i.h | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) 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 1c147721f67e..9c92fd487e6e 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_client.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_client.c @@ -1449,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; @@ -1461,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)) { 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,