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); 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; 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"); diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index de5d8d7ac681..5cc4a5e02ade 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);