Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0008d16b authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: ipa3: Fix to handle zero length frag skb packet"

parents 8bfcb5a6 1f9481a6
Loading
Loading
Loading
Loading
+6 −4
Original line number Original line Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
// 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
#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_rx_empty=%u\n"
		"lan_repl_rx_empty=%u\n"
		"lan_repl_rx_empty=%u\n"
		"flow_enable=%u\n"
		"flow_enable=%u\n"
		"flow_disable=%u\n",
		"flow_disable=%u\n"
		"rx_page_drop_cnt=%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_sw_pkts,
		ipa3_ctx->stats.tx_hw_pkts,
		ipa3_ctx->stats.tx_hw_pkts,
		ipa3_ctx->stats.tx_non_linear,
		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.lan_repl_rx_empty,
		ipa3_ctx->stats.flow_enable,
		ipa3_ctx->stats.flow_enable,
		ipa3_ctx->stats.flow_disable,
		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;
	cnt += nbytes;


	for (i = 0; i < IPAHAL_PKT_STATUS_EXCEPTION_MAX; i++) {
	for (i = 0; i < IPAHAL_PKT_STATUS_EXCEPTION_MAX; i++) {
+17 −10
Original line number Original line Diff line number Diff line
@@ -1725,22 +1725,29 @@ int ipa3_tx_dp(enum ipa_client_type dst, struct sk_buff *skb,
		data_idx++;
		data_idx++;


		for (f = 0; f < num_frags; f++) {
		for (f = 0; f < num_frags; f++) {
			desc[data_idx + f].frag = &skb_shinfo(skb)->frags[f];
			if (skb_frag_size(&skb_shinfo(skb)->frags[f]) != 0) {
			desc[data_idx + f].type = IPA_DATA_DESC_SKB_PAGED;
				desc[data_idx].frag =
			desc[data_idx + f].len =
					&skb_shinfo(skb)->frags[f];
				skb_frag_size(desc[data_idx + f].frag);
				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 */
		/* don't free skb till frag mappings are released */
		if (num_frags) {
		if (num_frags) {
			desc[data_idx + f - 1].callback =
			desc[data_idx - 1].callback = desc[skb_idx].callback;
				desc[skb_idx].callback;
			desc[data_idx - 1].user1 = desc[skb_idx].user1;
			desc[data_idx + f - 1].user1 = desc[skb_idx].user1;
			desc[data_idx - 1].user2 = desc[skb_idx].user2;
			desc[data_idx + f - 1].user2 = desc[skb_idx].user2;
			desc[skb_idx].callback = NULL;
			desc[skb_idx].callback = NULL;
		}
		}


		if (unlikely(ipa3_send(sys, num_frags + data_idx,
		if (unlikely(ipa3_send(sys, data_idx, desc, true))) {
		    desc, true))) {
			IPAERR_RL("fail to send skb %pK num_frags %u SWP\n",
			IPAERR_RL("fail to send skb %pK num_frags %u SWP\n",
				skb, num_frags);
				skb, num_frags);
			goto fail_send;
			goto fail_send;
+1 −0
Original line number Original line Diff line number Diff line
@@ -1381,6 +1381,7 @@ struct ipa3_stats {
	u32 flow_disable;
	u32 flow_disable;
	u32 tx_non_linear;
	u32 tx_non_linear;
	u32 rx_page_drop_cnt;
	u32 rx_page_drop_cnt;
	u32 zero_len_frag_pkt_cnt;
	struct ipa3_page_recycle_stats page_recycle_stats[2];
	struct ipa3_page_recycle_stats page_recycle_stats[2];
};
};