From b26c6609c2c25d12210bde0390c616c5483b64c6 Mon Sep 17 00:00:00 2001 From: Piyush Dhyani Date: Tue, 5 Jan 2021 12:15:32 +0530 Subject: [PATCH 1/4] msm: ipa: Fix string out of bound issue. Currently during RMNET_IOCTL_GET_MTU and RMNET_IOCTL_SET_MTU ioctls we can recieve not null terminated string for if_name which was resulting in string out of bound error while accessing the if_name. Now adding null character at the end of string to prevent access beyond its size. Change-Id: I4d82a4b491f04a85d6ab4f0211671520156f7c61 Signed-off-by: Piyush Dhyani --- drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index 4e447e453acb..396802dac652 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c @@ -2095,6 +2095,8 @@ static int ipa3_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /* Get MTU */ case RMNET_IOCTL_GET_MTU: mux_channel = rmnet_ipa3_ctx->mux_channel; + ext_ioctl_data.u.mtu_params.if_name + [IFNAMSIZ-1] = '\0'; rmnet_index = find_vchannel_name_index(ext_ioctl_data.u.mtu_params.if_name); @@ -2115,6 +2117,8 @@ static int ipa3_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /* Set MTU */ case RMNET_IOCTL_SET_MTU: mux_channel = rmnet_ipa3_ctx->mux_channel; + ext_ioctl_data.u.mtu_params.if_name + [IFNAMSIZ-1] = '\0'; rmnet_index = find_vchannel_name_index(ext_ioctl_data.u.mtu_params.if_name); From 741d97715b07a9df3ac9bf139bcea6de44bcbdff Mon Sep 17 00:00:00 2001 From: Ashok Vuyyuru Date: Thu, 11 Mar 2021 21:09:01 +0530 Subject: [PATCH 2/4] msm: ipa3: Use read memory barrier before reading events Use read memory barrier before reading event from event ring. Since ring is shared resource between IPA h/w and IPA driver dma_rmb is used to ensure memory write is complete before reading from driver. Change-Id: If2b86ee1acecbdfc75beb327eb60f876e6915d8f Signed-off-by: Ashok Vuyyuru --- drivers/platform/msm/gsi/gsi.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/platform/msm/gsi/gsi.c b/drivers/platform/msm/gsi/gsi.c index 4dfb0aaf317a..5725a40c1ea7 100644 --- a/drivers/platform/msm/gsi/gsi.c +++ b/drivers/platform/msm/gsi/gsi.c @@ -598,8 +598,7 @@ static void gsi_process_evt_re(struct gsi_evt_ctx *ctx, /* RMB before reading event ring shared b/w IPA h/w & driver * ordering between IPA h/w store and CPU load */ - if (callback) - dma_rmb(); + dma_rmb(); evt = (struct gsi_xfer_compl_evt *)(ctx->ring.base_va + ctx->ring.rp_local - ctx->ring.base); gsi_process_chan(evt, notify, callback); From 52eb4e3564de48b662a6ade21d7a5c913d68e656 Mon Sep 17 00:00:00 2001 From: Piyush Dhyani Date: Tue, 16 Mar 2021 11:44:06 +0530 Subject: [PATCH 3/4] 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 6b83b804126f86eda2c63bebc27eb2d373b4de7a Mon Sep 17 00:00:00 2001 From: Piyush Dhyani Date: Wed, 20 Jan 2021 23:26:07 +0530 Subject: [PATCH 4/4] msm: gsi: Add changes to capture wdi channel health For wdi channels we have different logic to moniter channel health as compared to gpi channels. Now adding changes on existing channel stats api to capture health for wdi channels. Change-Id: Ice99e5aee40e3cc30545d2dfd95d6e85007d8c9d Signed-off-by: Piyush Dhyani Signed-off-by: Ashok Vuyyuru --- drivers/platform/msm/gsi/gsi_dbg.c | 48 ++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/drivers/platform/msm/gsi/gsi_dbg.c b/drivers/platform/msm/gsi/gsi_dbg.c index 8d6fdd35562f..e264ea68250d 100644 --- a/drivers/platform/msm/gsi/gsi_dbg.c +++ b/drivers/platform/msm/gsi/gsi_dbg.c @@ -482,20 +482,44 @@ static void gsi_dbg_update_ch_dp_stats(struct gsi_chan_ctx *ctx) int ee = gsi_ctx->per.ee; uint16_t used_hw; - rp_hw = gsi_readl(gsi_ctx->base + - GSI_EE_n_GSI_CH_k_CNTXT_4_OFFS(ctx->props.ch_id, ee)); - rp_hw |= ((uint64_t)gsi_readl(gsi_ctx->base + - GSI_EE_n_GSI_CH_k_CNTXT_5_OFFS(ctx->props.ch_id, ee))) - << 32; + if ( ctx->props.prot == GSI_CHAN_PROT_WDI2) { + rp_hw = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_4_OFFS(ctx->props.ch_id, gsi_ctx->per.ee)) & + 0x0000ffff; - wp_hw = gsi_readl(gsi_ctx->base + - GSI_EE_n_GSI_CH_k_CNTXT_6_OFFS(ctx->props.ch_id, ee)); - wp_hw |= ((uint64_t)gsi_readl(gsi_ctx->base + - GSI_EE_n_GSI_CH_k_CNTXT_7_OFFS(ctx->props.ch_id, ee))) - << 32; + wp_hw = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_RE_FETCH_WRITE_PTR_OFFS(ctx->props.ch_id, + gsi_ctx->per.ee)); - start_hw = gsi_find_idx_from_addr(&ctx->ring, rp_hw); - end_hw = gsi_find_idx_from_addr(&ctx->ring, wp_hw); + start_hw = rp_hw / ctx->ring.elem_sz; + end_hw = wp_hw / ctx->ring.elem_sz; + } else if ( ctx->props.prot == GSI_CHAN_PROT_WDI3) { + rp_hw = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_4_OFFS(ctx->props.ch_id, gsi_ctx->per.ee)) & + 0x000fffff; + + wp_hw = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_RE_FETCH_WRITE_PTR_OFFS(ctx->props.ch_id, + gsi_ctx->per.ee)); + + start_hw = rp_hw / ctx->ring.elem_sz; + end_hw = wp_hw / ctx->ring.elem_sz; + } else { + rp_hw = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_4_OFFS(ctx->props.ch_id, ee)); + rp_hw |= ((uint64_t)gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_5_OFFS(ctx->props.ch_id, ee))) + << 32; + + wp_hw = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_6_OFFS(ctx->props.ch_id, ee)); + wp_hw |= ((uint64_t)gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_7_OFFS(ctx->props.ch_id, ee))) + << 32; + + start_hw = gsi_find_idx_from_addr(&ctx->ring, rp_hw); + end_hw = gsi_find_idx_from_addr(&ctx->ring, wp_hw); + } if (end_hw >= start_hw) used_hw = end_hw - start_hw;