From 6a1c52956f6886d02e99c7f92d87e3851f343b4c Mon Sep 17 00:00:00 2001 From: Ashok Vuyyuru Date: Mon, 26 Oct 2020 17:14:19 +0530 Subject: [PATCH 1/2] msm: ipa3: Enable hardbyte limit for WAN consumer pipe Enable hardbyte limit WAN consumer pipe. Change-Id: I27c5af71aeadfb40e6870da24c0b69f1cd60d806 Signed-off-by: Ashok Vuyyuru --- drivers/platform/msm/ipa/ipa_v3/ipa_dp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c index 99fbd68e0e51..5e05e5d9f628 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c @@ -3922,7 +3922,9 @@ static void ipa3_set_aggr_limit(struct ipa_sys_connect_params *in, sys->ep->status.status_en = false; sys->rx_buff_sz = IPA_GENERIC_RX_BUFF_SZ(adjusted_sz); - if (in->client == IPA_CLIENT_APPS_WAN_COAL_CONS) + if (in->client == IPA_CLIENT_APPS_WAN_COAL_CONS || + (in->client == IPA_CLIENT_APPS_WAN_CONS && + ipa3_ctx->ipa_hw_type <= IPA_HW_v4_2)) in->ipa_ep_cfg.aggr.aggr_hard_byte_limit_en = 1; *aggr_byte_limit = sys->rx_buff_sz < *aggr_byte_limit ? From 579642679d56ac26f46d9791af12462331143c2a Mon Sep 17 00:00:00 2001 From: Praveen Kurapati Date: Thu, 3 Jun 2021 14:35:29 +0530 Subject: [PATCH 2/2] msm: ipa3: Add change to retry memory allocation on failure Adding changes to retry with GFP_KENREL flag when memory allocation fails with GFP_ATOMIC flag. Panic the device if after max retries also memory allocation fails. Change-Id: Ic9ad827757de92715be5acc5645b7e860b4bd0e4 Signed-off-by: Praveen Kurapati --- drivers/platform/msm/ipa/ipa_v3/ipa_dp.c | 45 ++++++++++++++++-------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c index 99fbd68e0e51..debb01d2f864 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c @@ -89,6 +89,8 @@ #define IPA_QMAP_ID_BYTE 0 +#define IPA_MEM_ALLOC_RETRY 5 + static struct sk_buff *ipa3_get_skb_ipa_rx(unsigned int len, gfp_t flags); static void ipa3_replenish_wlan_rx_cache(struct ipa3_sys_context *sys); static void ipa3_replenish_rx_cache(struct ipa3_sys_context *sys); @@ -4876,6 +4878,33 @@ fail_setup_event_ring: return result; } +static void *ipa3_ring_alloc(struct device *dev, size_t size, + dma_addr_t *dma_handle, gfp_t gfp) +{ + void *va_addr; + int retry_cnt = 0; + +alloc: + va_addr = dma_alloc_coherent(dev, size, dma_handle, gfp); + if (!va_addr) { + if (retry_cnt < IPA_MEM_ALLOC_RETRY) { + IPADBG("Fail to dma alloc retry cnt = %d\n", + retry_cnt); + retry_cnt++; + goto alloc; + } + + if (gfp == GFP_ATOMIC) { + gfp = GFP_KERNEL; + goto alloc; + } + IPAERR("fail to dma alloc %u bytes\n", size); + ipa_assert(); + } + + return va_addr; +} + static int ipa_gsi_setup_event_ring(struct ipa3_ep_context *ep, u32 ring_size, gfp_t mem_flag) { @@ -4892,13 +4921,8 @@ static int ipa_gsi_setup_event_ring(struct ipa3_ep_context *ep, gsi_evt_ring_props.re_size = GSI_EVT_RING_RE_SIZE_16B; gsi_evt_ring_props.ring_len = ring_size; gsi_evt_ring_props.ring_base_vaddr = - dma_alloc_coherent(ipa3_ctx->pdev, gsi_evt_ring_props.ring_len, + ipa3_ring_alloc(ipa3_ctx->pdev, gsi_evt_ring_props.ring_len, &evt_dma_addr, mem_flag); - if (!gsi_evt_ring_props.ring_base_vaddr) { - IPAERR("fail to dma alloc %u bytes\n", - gsi_evt_ring_props.ring_len); - return -ENOMEM; - } gsi_evt_ring_props.ring_base_addr = evt_dma_addr; /* copy mem info */ @@ -5006,14 +5030,8 @@ static int ipa_gsi_setup_transfer_ring(struct ipa3_ep_context *ep, gsi_channel_props.ring_len = ring_size; gsi_channel_props.ring_base_vaddr = - dma_alloc_coherent(ipa3_ctx->pdev, gsi_channel_props.ring_len, + ipa3_ring_alloc(ipa3_ctx->pdev, gsi_channel_props.ring_len, &dma_addr, mem_flag); - if (!gsi_channel_props.ring_base_vaddr) { - IPAERR("fail to dma alloc %u bytes\n", - gsi_channel_props.ring_len); - result = -ENOMEM; - goto fail_alloc_channel_ring; - } gsi_channel_props.ring_base_addr = dma_addr; /* copy mem info */ @@ -5091,7 +5109,6 @@ fail_alloc_channel: dma_free_coherent(ipa3_ctx->pdev, ep->gsi_mem_info.chan_ring_len, ep->gsi_mem_info.chan_ring_base_vaddr, ep->gsi_mem_info.chan_ring_base_addr); -fail_alloc_channel_ring: fail_get_gsi_ep_info: if (ep->gsi_evt_ring_hdl != ~0) { gsi_dealloc_evt_ring(ep->gsi_evt_ring_hdl);