Blame SOURCES/0049-netdrv-bnxt_en-Add-hardware-GRO-setup-function-for-5.patch

f95c89
From f18c355c95b64d442e4f0cee4e44f6ef2b3d8905 Mon Sep 17 00:00:00 2001
f95c89
From: Jonathan Toppins <jtoppins@redhat.com>
f95c89
Date: Wed, 2 Oct 2019 18:23:04 -0400
f95c89
Subject: [PATCH 49/96] [netdrv] bnxt_en: Add hardware GRO setup function for
f95c89
 57500 chips
f95c89
f95c89
Message-id: <8e748026e423be248e251a6fb5aa5c7dc5814864.1570027456.git.jtoppins@redhat.com>
f95c89
Patchwork-id: 276466
f95c89
O-Subject: [RHEL-8.2 PATCH 42/78] bnxt_en: Add hardware GRO setup function for 57500 chips.
f95c89
Bugzilla: 1724766
f95c89
RH-Acked-by: John Linville <linville@redhat.com>
f95c89
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
f95c89
f95c89
Add a more optimized hardware GRO function to setup the SKB on 57500
f95c89
chips.  Some workaround code is no longer needed on 57500 chips and
f95c89
the pseudo checksum is also calculated in hardware, so no need to
f95c89
do the software pseudo checksum in the driver.
f95c89
f95c89
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
f95c89
Signed-off-by: David S. Miller <davem@davemloft.net>
f95c89
(cherry picked from commit 67912c366d4bb0a9d108459e7c845cc7ba83f76f)
f95c89
Bugzilla: 1724766
f95c89
Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532
f95c89
Tested: build, boot, basic ping
f95c89
Signed-off-by: Jonathan Toppins <jtoppins@redhat.com>
f95c89
Signed-off-by: Bruno Meneguele <bmeneg@redhat.com>
f95c89
---
f95c89
 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 33 ++++++++++++++++++++++++++++++-
f95c89
 1 file changed, 32 insertions(+), 1 deletion(-)
f95c89
f95c89
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c
f95c89
===================================================================
f95c89
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c	2020-02-06 16:23:16.749503615 +0100
f95c89
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c	2020-02-06 16:23:16.886502357 +0100
f95c89
@@ -1361,6 +1361,35 @@
f95c89
 	return skb;
f95c89
 }
f95c89
 
f95c89
+static struct sk_buff *bnxt_gro_func_5750x(struct bnxt_tpa_info *tpa_info,
f95c89
+					   int payload_off, int tcp_ts,
f95c89
+					   struct sk_buff *skb)
f95c89
+{
f95c89
+#ifdef CONFIG_INET
f95c89
+	u16 outer_ip_off, inner_ip_off, inner_mac_off;
f95c89
+	u32 hdr_info = tpa_info->hdr_info;
f95c89
+	int iphdr_len, nw_off;
f95c89
+
f95c89
+	inner_ip_off = BNXT_TPA_INNER_L3_OFF(hdr_info);
f95c89
+	inner_mac_off = BNXT_TPA_INNER_L2_OFF(hdr_info);
f95c89
+	outer_ip_off = BNXT_TPA_OUTER_L3_OFF(hdr_info);
f95c89
+
f95c89
+	nw_off = inner_ip_off - ETH_HLEN;
f95c89
+	skb_set_network_header(skb, nw_off);
f95c89
+	iphdr_len = (tpa_info->flags2 & RX_TPA_START_CMP_FLAGS2_IP_TYPE) ?
f95c89
+		     sizeof(struct ipv6hdr) : sizeof(struct iphdr);
f95c89
+	skb_set_transport_header(skb, nw_off + iphdr_len);
f95c89
+
f95c89
+	if (inner_mac_off) { /* tunnel */
f95c89
+		__be16 proto = *((__be16 *)(skb->data + outer_ip_off -
f95c89
+					    ETH_HLEN - 2));
f95c89
+
f95c89
+		bnxt_gro_tunnel(skb, proto);
f95c89
+	}
f95c89
+#endif
f95c89
+	return skb;
f95c89
+}
f95c89
+
f95c89
 #define BNXT_IPV4_HDR_SIZE	(sizeof(struct iphdr) + sizeof(struct tcphdr))
f95c89
 #define BNXT_IPV6_HDR_SIZE	(sizeof(struct ipv6hdr) + sizeof(struct tcphdr))
f95c89
 
f95c89
@@ -10920,8 +10949,10 @@
f95c89
 #endif
f95c89
 	if (BNXT_SUPPORTS_TPA(bp)) {
f95c89
 		bp->gro_func = bnxt_gro_func_5730x;
f95c89
-		if (BNXT_CHIP_P4_PLUS(bp))
f95c89
+		if (BNXT_CHIP_P4(bp))
f95c89
 			bp->gro_func = bnxt_gro_func_5731x;
f95c89
+		else if (BNXT_CHIP_P5(bp))
f95c89
+			bp->gro_func = bnxt_gro_func_5750x;
f95c89
 	}
f95c89
 	if (!BNXT_CHIP_P4_PLUS(bp))
f95c89
 		bp->flags |= BNXT_FLAG_DOUBLE_DB;