From 4e3719b0fc86b4067ffd72d870fdf9844c4e7bb5 Mon Sep 17 00:00:00 2001 From: Chaitanya Pratapa Date: Fri, 21 Aug 2020 12:35:54 -0700 Subject: [PATCH 1/9] msm: gsi: dump channel information Dump channel information when stop channel fails. Change-Id: I39ef3338c9e7e968ee6a592debc23edbff9f8fc8 Signed-off-by: Chaitanya Pratapa --- drivers/platform/msm/gsi/gsi.c | 74 +++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/drivers/platform/msm/gsi/gsi.c b/drivers/platform/msm/gsi/gsi.c index 019a666ef9cb..37f8ef44749c 100644 --- a/drivers/platform/msm/gsi/gsi.c +++ b/drivers/platform/msm/gsi/gsi.c @@ -3124,6 +3124,77 @@ int gsi_start_channel(unsigned long chan_hdl) } EXPORT_SYMBOL(gsi_start_channel); +static void gsi_dump_ch(unsigned long chan_hdl) +{ + uint32_t val; + + if (!gsi_ctx) { + pr_err("%s:%d gsi context not allocated\n", __func__, __LINE__); + return; + } + + if (chan_hdl >= gsi_ctx->max_ch) { + GSIDBG("invalid chan id %u\n", chan_hdl); + return; + } + + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_0_OFFS(chan_hdl, gsi_ctx->per.ee)); + GSIERR("CH%2d CTX0 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_1_OFFS(chan_hdl, gsi_ctx->per.ee)); + GSIERR("CH%2d CTX1 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_2_OFFS(chan_hdl, gsi_ctx->per.ee)); + GSIERR("CH%2d CTX2 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_3_OFFS(chan_hdl, gsi_ctx->per.ee)); + GSIERR("CH%2d CTX3 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_4_OFFS(chan_hdl, gsi_ctx->per.ee)); + GSIERR("CH%2d CTX4 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_5_OFFS(chan_hdl, gsi_ctx->per.ee)); + GSIERR("CH%2d CTX5 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_6_OFFS(chan_hdl, gsi_ctx->per.ee)); + GSIERR("CH%2d CTX6 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_7_OFFS(chan_hdl, gsi_ctx->per.ee)); + GSIERR("CH%2d CTX7 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_RE_FETCH_READ_PTR_OFFS(chan_hdl, + gsi_ctx->per.ee)); + GSIERR("CH%2d REFRP 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_RE_FETCH_WRITE_PTR_OFFS(chan_hdl, + gsi_ctx->per.ee)); + GSIERR("CH%2d REFWP 0x%x\n", chan_hdl, val); + if (gsi_ctx->per.ver >= GSI_VER_2_5) { + val = gsi_readl(gsi_ctx->base + + GSI_V2_5_EE_n_GSI_CH_k_QOS_OFFS(chan_hdl, gsi_ctx->per.ee)); + } else { + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_QOS_OFFS(chan_hdl, gsi_ctx->per.ee)); + } + GSIERR("CH%2d QOS 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_SCRATCH_0_OFFS(chan_hdl, gsi_ctx->per.ee)); + GSIERR("CH%2d SCR0 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_SCRATCH_1_OFFS(chan_hdl, gsi_ctx->per.ee)); + GSIERR("CH%2d SCR1 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_SCRATCH_2_OFFS(chan_hdl, gsi_ctx->per.ee)); + GSIERR("CH%2d SCR2 0x%x\n", chan_hdl, val); + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_SCRATCH_3_OFFS(chan_hdl, gsi_ctx->per.ee)); + GSIERR("CH%2d SCR3 0x%x\n", chan_hdl, val); + + return; +} + + int gsi_stop_channel(unsigned long chan_hdl) { enum gsi_ch_cmd_opcode op = GSI_CH_STOP; @@ -3176,7 +3247,7 @@ int gsi_stop_channel(unsigned long chan_hdl) gsi_writel(val, gsi_ctx->base + GSI_EE_n_GSI_CH_CMD_OFFS(gsi_ctx->per.ee)); - GSIDBG("GSI Channel Stop, waiting for completion\n"); + GSIDBG("GSI Channel Stop, waiting for completion: 0x%x\n", val); gsi_channel_state_change_wait(chan_hdl, ctx, GSI_STOP_CMD_TIMEOUT_MS, op); @@ -3184,6 +3255,7 @@ int gsi_stop_channel(unsigned long chan_hdl) if (ctx->state != GSI_CHAN_STATE_STOPPED && ctx->state != GSI_CHAN_STATE_STOP_IN_PROC) { GSIERR("chan=%lu unexpected state=%u\n", chan_hdl, ctx->state); + gsi_dump_ch(chan_hdl); res = -GSI_STATUS_BAD_STATE; BUG(); goto free_lock; From 0d5800910f4bf28fe79de41806bc446f22954527 Mon Sep 17 00:00:00 2001 From: Michael Adisumarta Date: Thu, 8 Oct 2020 16:22:27 -0700 Subject: [PATCH 2/9] msm: ipa: Fix use-after-free in ipa3_alloc_counter_id Make changes to memcopy before preload end. Change-Id: Icc056a3bcd5b739b8165813202c87dd84e72c78a Signed-off-by: Michael Adisumarta --- drivers/platform/msm/ipa/ipa_v3/ipa_utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c index 7c44b78b87c9..5b40376d7d1a 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c @@ -7057,9 +7057,9 @@ mark_sw_cnt: done: /* get a handle from idr for dealloc */ counter->hdl = __ipa3_alloc_counter_hdl(counter); + memcpy(header, counter, sizeof(struct ipa_ioc_flt_rt_counter_alloc)); spin_unlock(&ipa3_ctx->flt_rt_counters.hdl_lock); idr_preload_end(); - memcpy(header, counter, sizeof(struct ipa_ioc_flt_rt_counter_alloc)); return 0; err: From d0c1bd6bdf86fc9a6cd9662bd60cd2070ebf30a5 Mon Sep 17 00:00:00 2001 From: Michael Adisumarta Date: Wed, 14 Oct 2020 15:32:50 -0700 Subject: [PATCH 3/9] msm: ipa: removing warn on no client callback Removing warn on whilst no client call back on pm register. Signed-off-by: Michael Adisumarta --- drivers/platform/msm/ipa/ipa_v3/ipa_pm.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_pm.c b/drivers/platform/msm/ipa/ipa_v3/ipa_pm.c index 9e34e69abb5a..fc19614bc2d3 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_pm.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_pm.c @@ -445,7 +445,6 @@ static void activate_work_func(struct work_struct *work) IPA_PM_CLIENT_ACTIVATED); } else { IPA_PM_ERR_RL("client has no callback"); - WARN_ON_RATELIMIT_IPA(1); } mutex_unlock(&ipa_pm_ctx->client_mutex); From 6e129eb1ea51042204c00cd75523ca651d8fc6bb Mon Sep 17 00:00:00 2001 From: Praveen Kurapati Date: Tue, 15 Sep 2020 16:31:54 +0530 Subject: [PATCH 4/9] msm: ipa4: Add change to stop netdev As SSR event is not received to APPS, some data is sent to modem. Add change to stop netdev first during SSR events and halt the modem channels. Change-Id: Id62d5f0cf811a30dc796401c15cf1ed6b8425992 Signed-off-by: Praveen Kurapati --- drivers/platform/msm/ipa/ipa_v3/ipa.c | 8 ++++++-- drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 918a037392d5..19b1a9ceabcb 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -3965,6 +3965,8 @@ void ipa3_update_ssr_state(bool is_ssr) */ void ipa3_q6_pre_shutdown_cleanup(void) { + bool prod = false; + IPADBG_LOW("ENTER\n"); IPA_ACTIVE_CLIENTS_INC_SIMPLE(); @@ -3973,6 +3975,10 @@ void ipa3_q6_pre_shutdown_cleanup(void) if (!ipa3_ctx->ipa_endp_delay_wa) ipa3_q6_pipe_delay(true); ipa3_q6_avoid_holb(); + 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, IPA_CLIENT_MHI_CONS); @@ -4030,8 +4036,6 @@ void ipa3_q6_post_shutdown_cleanup(void) /* halt both prod and cons channels starting at IPAv4 */ if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_0) { - prod = true; - ipa3_halt_q6_gsi_channels(prod); IPA_ACTIVE_CLIENTS_DEC_SIMPLE(); IPADBG("Exit without consumer check\n"); return; diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index 81d093b9a3e3..69d9656eb3a5 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c @@ -2857,12 +2857,13 @@ static int ipa3_lcl_mdm_ssr_notifier_cb(struct notifier_block *this, switch (code) { case SUBSYS_BEFORE_SHUTDOWN: IPAWANINFO("IPA received MPSS BEFORE_SHUTDOWN\n"); + /*Stop netdev first to stop queueing pkts to Q6 */ + if (IPA_NETDEV()) + netif_stop_queue(IPA_NETDEV()); /* send SSR before-shutdown notification to IPACM */ rmnet_ipa_send_ssr_notification(false); atomic_set(&rmnet_ipa3_ctx->is_ssr, 1); ipa3_q6_pre_shutdown_cleanup(); - if (IPA_NETDEV()) - netif_stop_queue(IPA_NETDEV()); ipa3_qmi_stop_workqueues(); ipa3_wan_ioctl_stop_qmi_messages(); ipa_stop_polling_stats(); From ccab5b663ee28f8401d327c4bb442ddf7dee3f65 Mon Sep 17 00:00:00 2001 From: Pooja Kumari Date: Mon, 19 Oct 2020 12:59:47 +0530 Subject: [PATCH 5/9] msm: ipa3: Add max PDN num based on hardware version Currently defined max PDN number is generic for all hardware version which is incorrect. Define PDN based on hardware version to support correct number of PDN. Change-Id: I3e898a32104562584b4702132c57b7f1cb8deeca Signed-off-by: Pooja Kumari --- drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c | 2 +- drivers/platform/msm/ipa/ipa_v3/ipa_flt.c | 2 +- drivers/platform/msm/ipa/ipa_v3/ipa_i.h | 2 ++ drivers/platform/msm/ipa/ipa_v3/ipa_nat.c | 6 +++--- drivers/platform/msm/ipa/ipa_v3/ipa_utils.c | 15 +++++++++++++++ 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c index 7012182e5510..c635d1cc5b15 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c @@ -2058,7 +2058,7 @@ static void ipa3_read_pdn_table(void) } for (i = 0, pdn_entry = ipa3_ctx->nat_mem.pdn_mem.base; - i < IPA_MAX_PDN_NUM; + i < ipa3_get_max_pdn(); ++i, pdn_entry += pdn_entry_size) { result = ipahal_nat_is_entry_zeroed( diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c b/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c index a5794e996d0d..7931a8e491a0 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c @@ -852,7 +852,7 @@ static int __ipa_validate_flt_rule(const struct ipa_flt_rule_i *rule, "PDN index should be 0 when action is not pass to NAT\n"); goto error; } else { - if (rule->pdn_idx >= IPA_MAX_PDN_NUM) { + if (rule->pdn_idx >= ipa3_get_max_pdn()) { IPAERR_RL("PDN index %d is too large\n", rule->pdn_idx); goto error; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index ac7d637b3962..e0b43c7d6236 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -2872,6 +2872,8 @@ int ipa3_query_intf_tx_props(struct ipa_ioc_query_intf_tx_props *tx); int ipa3_query_intf_rx_props(struct ipa_ioc_query_intf_rx_props *rx); int ipa3_query_intf_ext_props(struct ipa_ioc_query_intf_ext_props *ext); +int ipa3_get_max_pdn(void); + void wwan_cleanup(void); int ipa3_teth_bridge_driver_init(void); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c b/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c index 467294965abb..5edd4776669e 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c @@ -704,7 +704,7 @@ int ipa3_allocate_nat_table( ipahal_nat_entry_size(IPAHAL_NAT_IPV4_PDN, &pdn_entry_size); - pdn_mem_ptr->size = pdn_entry_size * IPA_MAX_PDN_NUM; + pdn_mem_ptr->size = pdn_entry_size * ipa3_get_max_pdn(); if (IPA_MEM_PART(pdn_config_size) < pdn_mem_ptr->size) { IPAERR( @@ -1118,7 +1118,7 @@ static int ipa3_nat_create_modify_pdn_cmd( IPADBG("\n"); ipahal_nat_entry_size(IPAHAL_NAT_IPV4_PDN, &pdn_entry_size); - mem_size = pdn_entry_size * IPA_MAX_PDN_NUM; + mem_size = pdn_entry_size * ipa3_get_max_pdn(); /* Before providing physical base address check pointer exist or not*/ if (!ipa3_ctx->nat_mem.pdn_mem.base) @@ -1653,7 +1653,7 @@ int ipa3_nat_mdfy_pdn( goto bail; } - if (mdfy_pdn->pdn_index > (IPA_MAX_PDN_NUM - 1)) { + if (mdfy_pdn->pdn_index > (ipa3_get_max_pdn() - 1)) { IPAERR_RL("pdn index out of range %d\n", mdfy_pdn->pdn_index); result = -EPERM; goto bail; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c index 7c44b78b87c9..4d506d38d400 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c @@ -267,6 +267,7 @@ enum ipa_ver { IPA_4_5, IPA_4_5_MHI, IPA_4_5_APQ, + IPA_4_5_AUTO, IPA_4_7, IPA_4_9, IPA_4_11, @@ -9590,3 +9591,17 @@ int ipa3_get_prot_id(enum ipa_client_type client) return prot_id; } + +/** + * ipa3_get_max_pdn() - get max PDN number based on hardware version + * Returns: IPA_MAX_PDN_NUM of IPAv4_5 and IPA_MAX_PDN_NUM_v4_2 for others + * + */ + +int ipa3_get_max_pdn(void) +{ + if (ipa3_get_hw_type_index() == IPA_4_5_AUTO) + return IPA_MAX_PDN_NUM; + else + return IPA_MAX_PDN_NUM_v4; +} From c3b184eac49daa49302a5f234b0834ff46ebbc83 Mon Sep 17 00:00:00 2001 From: Praveen Kurapati Date: Wed, 17 Apr 2019 13:41:33 +0530 Subject: [PATCH 6/9] msm: ipa3: Assert the device when IPA FW not loaded Even though IPA FW is not loaded device continue perform other operations. Due to which device moves to unstable state. Added changes to assert the device when IPA FW not loaded. Change-Id: Ibc164ebfef382c0e06b0f9b81f91dcd5928a5f3c Signed-off-by: Praveen Kurapati --- drivers/platform/msm/ipa/ipa_v3/ipa.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 918a037392d5..e991ae19808b 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -6573,6 +6573,7 @@ static void ipa3_load_ipa_fw(struct work_struct *work) if (result) { IPAERR("IPA FW loading process has failed result=%d\n", result); + ipa_assert(); return; } mutex_lock(&ipa3_ctx->fw_load_data.lock); From 056ae77554ced19cfd6bc7ef46b3636fa5d39960 Mon Sep 17 00:00:00 2001 From: Ashok Vuyyuru Date: Tue, 20 Oct 2020 14:54:13 +0530 Subject: [PATCH 7/9] msm: ipa3: Fix race condition during teardwon pipe When endpoint in polling mode possible to pipe teardown trigger parallel it leads to race condition. Adding changes to check in endpoint came out of polling mode and continue to teardown the endpoint. Change-Id: I0b22d6a7a1f5229acec2dbc9dd5cb76488c09faa Signed-off-by: Ashok Vuyyuru --- drivers/platform/msm/gsi/gsi.c | 6 ++++++ drivers/platform/msm/ipa/ipa_v3/ipa_dp.c | 9 ++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/platform/msm/gsi/gsi.c b/drivers/platform/msm/gsi/gsi.c index 37f8ef44749c..f501fe088731 100644 --- a/drivers/platform/msm/gsi/gsi.c +++ b/drivers/platform/msm/gsi/gsi.c @@ -4008,6 +4008,12 @@ int gsi_poll_n_channel(unsigned long chan_hdl, return -GSI_STATUS_UNSUPPORTED_OP; } + /* Before going to poll packet make sure it was in allocated state */ + if (unlikely(ctx->state == GSI_CHAN_STATE_NOT_ALLOCATED)) { + GSIERR("bad state %d\n", ctx->state); + return -GSI_STATUS_UNSUPPORTED_OP; + } + if (!ctx->evtr) { GSIERR("no event ring associated chan_hdl=%lu\n", chan_hdl); return -GSI_STATUS_UNSUPPORTED_OP; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c index 678fb5bc76bf..fcd0160ed462 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c @@ -1479,11 +1479,10 @@ int ipa3_teardown_sys_pipe(u32 clnt_hdl) return result; } - if (ep->sys->napi_obj) { - do { - usleep_range(95, 105); - } while (atomic_read(&ep->sys->curr_polling_state)); - } + /* Wait untill end point moving to interrupt mode before teardown */ + do { + usleep_range(95, 105); + } while (atomic_read(&ep->sys->curr_polling_state)); if (IPA_CLIENT_IS_CONS(ep->client)) cancel_delayed_work_sync(&ep->sys->replenish_rx_work); From 09b18bfd9e7bee5e2a4e9173f546f95d7a4c7e52 Mon Sep 17 00:00:00 2001 From: Praveen Kurapati Date: Tue, 29 Sep 2020 21:49:36 +0530 Subject: [PATCH 8/9] msm:ipa4: Fix race condition Add change to fix race condition when freeing QMI handles during SSR scenario. Change-Id: Ie83f0386ea3bd9b40c4964327415421a144d4715 Signed-off-by: Praveen Kurapati --- drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c index f379a4fbe0ba..e9d1c84f968b 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c @@ -474,6 +474,7 @@ static int ipa3_qmi_send_req_wait(struct qmi_handle *client_handle, return ret; } + mutex_lock(&ipa3_qmi_lock); ret = qmi_send_request(client_handle, &ipa3_qmi_ctx->server_sq, &txn, @@ -482,6 +483,10 @@ static int ipa3_qmi_send_req_wait(struct qmi_handle *client_handle, req_desc->ei_array, req); + if (unlikely(!ipa_q6_clnt)) + return -EINVAL; + mutex_unlock(&ipa3_qmi_lock); + if (ret < 0) { qmi_txn_cancel(&txn); return ret; @@ -1507,9 +1512,11 @@ static void ipa3_q6_clnt_svc_arrive(struct work_struct *work) IPAWANERR( "ipa3_qmi_init_modem_send_sync_msg failed due to SSR!\n"); /* Cleanup when ipa3_wwan_remove is called */ + mutex_lock(&ipa3_qmi_lock); qmi_handle_release(ipa_q6_clnt); vfree(ipa_q6_clnt); ipa_q6_clnt = NULL; + mutex_unlock(&ipa3_qmi_lock); return; } @@ -1849,6 +1856,7 @@ void ipa3_qmi_service_exit(void) /* qmi-client */ /* Release client handle */ + mutex_lock(&ipa3_qmi_lock); if (ipa_q6_clnt != NULL) { qmi_handle_release(ipa_q6_clnt); vfree(ipa_q6_clnt); @@ -1860,7 +1868,6 @@ void ipa3_qmi_service_exit(void) } /* clean the QMI msg cache */ - mutex_lock(&ipa3_qmi_lock); if (ipa3_qmi_ctx != NULL) { vfree(ipa3_qmi_ctx); ipa3_qmi_ctx = NULL; From 1ab1f500e3d5ea4fa8025cc72bad537e685b2e71 Mon Sep 17 00:00:00 2001 From: Ashok Vuyyuru Date: Fri, 1 May 2020 01:33:15 +0530 Subject: [PATCH 9/9] msm: ipa3: Fix to enable the HOLB during enable wdi pipe WLAN client disconnect scenario enable HOLB on WLAN consumer, with timer value 0. if client connected without disabling the hotspot, it was leading tput impact. To avoid this scenario during reconnect client configure the holb with timer value on WLAN consumer pipe. Change-Id: I33b4c97c4e6adea3107a46d5ca799379d255876c Signed-off-by: Ashok Vuyyuru --- drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c b/drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c index 6905fd163476..d948dd3eb425 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c @@ -2198,6 +2198,7 @@ int ipa3_enable_gsi_wdi_pipe(u32 clnt_hdl) struct ipa3_ep_context *ep; struct ipa_ep_cfg_ctrl ep_cfg_ctrl; int ipa_ep_idx; + struct ipa_ep_cfg_holb holb_cfg; IPADBG("ep=%d\n", clnt_hdl); @@ -2218,6 +2219,14 @@ int ipa3_enable_gsi_wdi_pipe(u32 clnt_hdl) memset(&ep_cfg_ctrl, 0, sizeof(struct ipa_ep_cfg_ctrl)); ipa3_cfg_ep_ctrl(ipa_ep_idx, &ep_cfg_ctrl); + if (IPA_CLIENT_IS_CONS(ep->client)) { + memset(&holb_cfg, 0, sizeof(holb_cfg)); + holb_cfg.en = IPA_HOLB_TMR_DIS; + holb_cfg.tmr_val = 0; + ipa3_cfg_ep_holb(clnt_hdl, &holb_cfg); + } + + IPA_ACTIVE_CLIENTS_DEC_EP(ipa3_get_client_mapping(clnt_hdl)); ep->gsi_offload_state |= IPA_WDI_ENABLED; IPADBG("client (ep: %d) enabled\n", clnt_hdl);