From 1f9481a658d117041d54cd7509f1039454ac3cd1 Mon Sep 17 00:00:00 2001 From: Ashok Vuyyuru Date: Mon, 30 Aug 2021 22:15:35 +0530 Subject: [PATCH] msm: ipa3: Fix to handle zero length frag skb packet Due to zero length skb packet IPA HW going to stall state. Adding changes to avoid sending these zero length SKB frag packets to HW. Change-Id: I4dae51bf767588095bc1fcd9e10196e913299227 Signed-off-by: Ashok Vuyyuru --- drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c | 10 ++++--- drivers/platform/msm/ipa/ipa_v3/ipa_dp.c | 27 ++++++++++++------- drivers/platform/msm/ipa/ipa_v3/ipa_i.h | 1 + 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c index 327122bd9c0d..bb96cfb6be6a 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.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. */ #ifdef CONFIG_DEBUG_FS @@ -1249,8 +1249,9 @@ static ssize_t ipa3_read_stats(struct file *file, char __user *ubuf, "lan_rx_empty=%u\n" "lan_repl_rx_empty=%u\n" "flow_enable=%u\n" - "flow_disable=%u\n", - "rx_page_drop_cnt=%u\n", + "flow_disable=%u\n" + "rx_page_drop_cnt=%u\n" + "zero_len_frag_pkt_cnt=%u\n", ipa3_ctx->stats.tx_sw_pkts, ipa3_ctx->stats.tx_hw_pkts, ipa3_ctx->stats.tx_non_linear, @@ -1267,7 +1268,8 @@ static ssize_t ipa3_read_stats(struct file *file, char __user *ubuf, ipa3_ctx->stats.lan_repl_rx_empty, ipa3_ctx->stats.flow_enable, ipa3_ctx->stats.flow_disable, - ipa3_ctx->stats.rx_page_drop_cnt); + ipa3_ctx->stats.rx_page_drop_cnt, + ipa3_ctx->stats.zero_len_frag_pkt_cnt); cnt += nbytes; for (i = 0; i < IPAHAL_PKT_STATUS_EXCEPTION_MAX; i++) { diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c index 616af6c3f318..7d8cea280176 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c @@ -1725,22 +1725,29 @@ int ipa3_tx_dp(enum ipa_client_type dst, struct sk_buff *skb, data_idx++; for (f = 0; f < num_frags; f++) { - desc[data_idx + f].frag = &skb_shinfo(skb)->frags[f]; - desc[data_idx + f].type = IPA_DATA_DESC_SKB_PAGED; - desc[data_idx + f].len = - skb_frag_size(desc[data_idx + f].frag); + if (skb_frag_size(&skb_shinfo(skb)->frags[f]) != 0) { + desc[data_idx].frag = + &skb_shinfo(skb)->frags[f]; + desc[data_idx].type = + IPA_DATA_DESC_SKB_PAGED; + desc[data_idx].len = + skb_frag_size(desc[data_idx].frag); + data_idx++; + } else { + IPAERR_RL("Received zero len SKB frag pkt\n"); + IPA_STATS_INC_CNT( + ipa3_ctx->stats.zero_len_frag_pkt_cnt); + } } /* don't free skb till frag mappings are released */ if (num_frags) { - desc[data_idx + f - 1].callback = - desc[skb_idx].callback; - desc[data_idx + f - 1].user1 = desc[skb_idx].user1; - desc[data_idx + f - 1].user2 = desc[skb_idx].user2; + desc[data_idx - 1].callback = desc[skb_idx].callback; + desc[data_idx - 1].user1 = desc[skb_idx].user1; + desc[data_idx - 1].user2 = desc[skb_idx].user2; desc[skb_idx].callback = NULL; } - if (unlikely(ipa3_send(sys, num_frags + data_idx, - desc, true))) { + if (unlikely(ipa3_send(sys, data_idx, desc, true))) { IPAERR_RL("fail to send skb %pK num_frags %u SWP\n", skb, num_frags); goto fail_send; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index a2c3f527e6f4..e9572d3d43a0 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -1381,6 +1381,7 @@ struct ipa3_stats { u32 flow_disable; u32 tx_non_linear; u32 rx_page_drop_cnt; + u32 zero_len_frag_pkt_cnt; struct ipa3_page_recycle_stats page_recycle_stats[2]; };