Blame SOURCES/0047-netdrv-bnxt_en-Add-fast-path-logic-for-TPA-on-57500-.patch

f95c89
From 321df466af8f407daf083b46f29e0b1ce454b25d Mon Sep 17 00:00:00 2001
f95c89
From: Jonathan Toppins <jtoppins@redhat.com>
f95c89
Date: Wed, 2 Oct 2019 18:23:02 -0400
f95c89
Subject: [PATCH 47/96] [netdrv] bnxt_en: Add fast path logic for TPA on 57500
f95c89
 chips
f95c89
f95c89
Message-id: <fad58a5dbdecd3dbc7df3d583d009f6c22f1a753.1570027456.git.jtoppins@redhat.com>
f95c89
Patchwork-id: 276470
f95c89
O-Subject: [RHEL-8.2 PATCH 40/78] bnxt_en: Add fast path logic for TPA on 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
With all the previous refactoring, the TPA fast path can now be
f95c89
modified slightly to support TPA on the new chips.  The main
f95c89
difference is that the agg completions are retrieved differently using
f95c89
the bnxt_get_tpa_agg_p5() function on the new chips.
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 bfcd8d791ec18496772d117774398e336917f56e)
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 | 100 ++++++++++++++++++++++--------
f95c89
 1 file changed, 75 insertions(+), 25 deletions(-)
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.499505910 +0100
f95c89
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c	2020-02-06 16:23:16.622504781 +0100
f95c89
@@ -842,6 +842,15 @@
f95c89
 	return agg;
f95c89
 }
f95c89
 
f95c89
+static struct rx_agg_cmp *bnxt_get_tpa_agg_p5(struct bnxt *bp,
f95c89
+					      struct bnxt_rx_ring_info *rxr,
f95c89
+					      u16 agg_id, u16 curr)
f95c89
+{
f95c89
+	struct bnxt_tpa_info *tpa_info = &rxr->rx_tpa[agg_id];
f95c89
+
f95c89
+	return &tpa_info->agg_arr[curr];
f95c89
+}
f95c89
+
f95c89
 static void bnxt_reuse_rx_agg_bufs(struct bnxt_cp_ring_info *cpr, u16 idx,
f95c89
 				   u16 start, u32 agg_bufs, bool tpa)
f95c89
 {
f95c89
@@ -850,8 +859,12 @@
f95c89
 	struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
f95c89
 	u16 prod = rxr->rx_agg_prod;
f95c89
 	u16 sw_prod = rxr->rx_sw_agg_prod;
f95c89
+	bool p5_tpa = false;
f95c89
 	u32 i;
f95c89
 
f95c89
+	if ((bp->flags & BNXT_FLAG_CHIP_P5) && tpa)
f95c89
+		p5_tpa = true;
f95c89
+
f95c89
 	for (i = 0; i < agg_bufs; i++) {
f95c89
 		u16 cons;
f95c89
 		struct rx_agg_cmp *agg;
f95c89
@@ -859,7 +872,10 @@
f95c89
 		struct rx_bd *prod_bd;
f95c89
 		struct page *page;
f95c89
 
f95c89
-		agg = bnxt_get_agg(bp, cpr, idx, start + i);
f95c89
+		if (p5_tpa)
f95c89
+			agg = bnxt_get_tpa_agg_p5(bp, rxr, idx, start + i);
f95c89
+		else
f95c89
+			agg = bnxt_get_agg(bp, cpr, idx, start + i);
f95c89
 		cons = agg->rx_agg_cmp_opaque;
f95c89
 		__clear_bit(cons, rxr->rx_agg_bmap);
f95c89
 
f95c89
@@ -976,8 +992,12 @@
f95c89
 	struct pci_dev *pdev = bp->pdev;
f95c89
 	struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
f95c89
 	u16 prod = rxr->rx_agg_prod;
f95c89
+	bool p5_tpa = false;
f95c89
 	u32 i;
f95c89
 
f95c89
+	if ((bp->flags & BNXT_FLAG_CHIP_P5) && tpa)
f95c89
+		p5_tpa = true;
f95c89
+
f95c89
 	for (i = 0; i < agg_bufs; i++) {
f95c89
 		u16 cons, frag_len;
f95c89
 		struct rx_agg_cmp *agg;
f95c89
@@ -985,7 +1005,10 @@
f95c89
 		struct page *page;
f95c89
 		dma_addr_t mapping;
f95c89
 
f95c89
-		agg = bnxt_get_agg(bp, cpr, idx, i);
f95c89
+		if (p5_tpa)
f95c89
+			agg = bnxt_get_tpa_agg_p5(bp, rxr, idx, i);
f95c89
+		else
f95c89
+			agg = bnxt_get_agg(bp, cpr, idx, i);
f95c89
 		cons = agg->rx_agg_cmp_opaque;
f95c89
 		frag_len = (le32_to_cpu(agg->rx_agg_cmp_len_flags_type) &
f95c89
 			    RX_AGG_CMP_LEN) >> RX_AGG_CMP_LEN_SHIFT;
f95c89
@@ -1091,6 +1114,9 @@
f95c89
 	} else if (cmp_type == CMP_TYPE_RX_L2_TPA_END_CMP) {
f95c89
 		struct rx_tpa_end_cmp *tpa_end = cmp;
f95c89
 
f95c89
+		if (bp->flags & BNXT_FLAG_CHIP_P5)
f95c89
+			return 0;
f95c89
+
f95c89
 		agg_bufs = TPA_END_AGG_BUFS(tpa_end);
f95c89
 	}
f95c89
 
f95c89
@@ -1132,22 +1158,27 @@
f95c89
 			   struct rx_tpa_start_cmp *tpa_start,
f95c89
 			   struct rx_tpa_start_cmp_ext *tpa_start1)
f95c89
 {
f95c89
-	u8 agg_id = TPA_START_AGG_ID(tpa_start);
f95c89
-	u16 cons, prod;
f95c89
-	struct bnxt_tpa_info *tpa_info;
f95c89
 	struct bnxt_sw_rx_bd *cons_rx_buf, *prod_rx_buf;
f95c89
+	struct bnxt_tpa_info *tpa_info;
f95c89
+	u16 cons, prod, agg_id;
f95c89
 	struct rx_bd *prod_bd;
f95c89
 	dma_addr_t mapping;
f95c89
 
f95c89
+	if (bp->flags & BNXT_FLAG_CHIP_P5)
f95c89
+		agg_id = TPA_START_AGG_ID_P5(tpa_start);
f95c89
+	else
f95c89
+		agg_id = TPA_START_AGG_ID(tpa_start);
f95c89
 	cons = tpa_start->rx_tpa_start_cmp_opaque;
f95c89
 	prod = rxr->rx_prod;
f95c89
 	cons_rx_buf = &rxr->rx_buf_ring[cons];
f95c89
 	prod_rx_buf = &rxr->rx_buf_ring[prod];
f95c89
 	tpa_info = &rxr->rx_tpa[agg_id];
f95c89
 
f95c89
-	if (unlikely(cons != rxr->rx_next_cons)) {
f95c89
-		netdev_warn(bp->dev, "TPA cons %x != expected cons %x\n",
f95c89
-			    cons, rxr->rx_next_cons);
f95c89
+	if (unlikely(cons != rxr->rx_next_cons ||
f95c89
+		     TPA_START_ERROR(tpa_start))) {
f95c89
+		netdev_warn(bp->dev, "TPA cons %x, expected cons %x, error code %x\n",
f95c89
+			    cons, rxr->rx_next_cons,
f95c89
+			    TPA_START_ERROR_CODE(tpa_start1));
f95c89
 		bnxt_sched_reset(bp, rxr);
f95c89
 		return;
f95c89
 	}
f95c89
@@ -1192,6 +1223,7 @@
f95c89
 	tpa_info->flags2 = le32_to_cpu(tpa_start1->rx_tpa_start_cmp_flags2);
f95c89
 	tpa_info->metadata = le32_to_cpu(tpa_start1->rx_tpa_start_cmp_metadata);
f95c89
 	tpa_info->hdr_info = le32_to_cpu(tpa_start1->rx_tpa_start_cmp_hdr_info);
f95c89
+	tpa_info->agg_count = 0;
f95c89
 
f95c89
 	rxr->rx_prod = NEXT_RX(prod);
f95c89
 	cons = NEXT_RX(cons);
f95c89
@@ -1365,7 +1397,10 @@
f95c89
 	skb_shinfo(skb)->gso_size =
f95c89
 		le32_to_cpu(tpa_end1->rx_tpa_end_cmp_seg_len);
f95c89
 	skb_shinfo(skb)->gso_type = tpa_info->gso_type;
f95c89
-	payload_off = TPA_END_PAYLOAD_OFF(tpa_end);
f95c89
+	if (bp->flags & BNXT_FLAG_CHIP_P5)
f95c89
+		payload_off = TPA_END_PAYLOAD_OFF_P5(tpa_end1);
f95c89
+	else
f95c89
+		payload_off = TPA_END_PAYLOAD_OFF(tpa_end);
f95c89
 	skb = bp->gro_func(tpa_info, payload_off, TPA_END_GRO_TS(tpa_end), skb);
f95c89
 	if (likely(skb))
f95c89
 		tcp_gro_complete(skb);
f95c89
@@ -1393,14 +1428,14 @@
f95c89
 {
f95c89
 	struct bnxt_napi *bnapi = cpr->bnapi;
f95c89
 	struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
f95c89
-	u8 agg_id = TPA_END_AGG_ID(tpa_end);
f95c89
 	u8 *data_ptr, agg_bufs;
f95c89
 	unsigned int len;
f95c89
 	struct bnxt_tpa_info *tpa_info;
f95c89
 	dma_addr_t mapping;
f95c89
 	struct sk_buff *skb;
f95c89
-	u16 idx = 0;
f95c89
+	u16 idx = 0, agg_id;
f95c89
 	void *data;
f95c89
+	bool gro;
f95c89
 
f95c89
 	if (unlikely(bnapi->in_reset)) {
f95c89
 		int rc = bnxt_discard_rx(bp, cpr, raw_cons, tpa_end);
f95c89
@@ -1410,24 +1445,39 @@
f95c89
 		return NULL;
f95c89
 	}
f95c89
 
f95c89
-	tpa_info = &rxr->rx_tpa[agg_id];
f95c89
+	if (bp->flags & BNXT_FLAG_CHIP_P5) {
f95c89
+		agg_id = TPA_END_AGG_ID_P5(tpa_end);
f95c89
+		agg_bufs = TPA_END_AGG_BUFS_P5(tpa_end1);
f95c89
+		tpa_info = &rxr->rx_tpa[agg_id];
f95c89
+		if (unlikely(agg_bufs != tpa_info->agg_count)) {
f95c89
+			netdev_warn(bp->dev, "TPA end agg_buf %d != expected agg_bufs %d\n",
f95c89
+				    agg_bufs, tpa_info->agg_count);
f95c89
+			agg_bufs = tpa_info->agg_count;
f95c89
+		}
f95c89
+		tpa_info->agg_count = 0;
f95c89
+		*event |= BNXT_AGG_EVENT;
f95c89
+		idx = agg_id;
f95c89
+		gro = !!(bp->flags & BNXT_FLAG_GRO);
f95c89
+	} else {
f95c89
+		agg_id = TPA_END_AGG_ID(tpa_end);
f95c89
+		agg_bufs = TPA_END_AGG_BUFS(tpa_end);
f95c89
+		tpa_info = &rxr->rx_tpa[agg_id];
f95c89
+		idx = RING_CMP(*raw_cons);
f95c89
+		if (agg_bufs) {
f95c89
+			if (!bnxt_agg_bufs_valid(bp, cpr, agg_bufs, raw_cons))
f95c89
+				return ERR_PTR(-EBUSY);
f95c89
+
f95c89
+			*event |= BNXT_AGG_EVENT;
f95c89
+			idx = NEXT_CMP(idx);
f95c89
+		}
f95c89
+		gro = !!TPA_END_GRO(tpa_end);
f95c89
+	}
f95c89
 	data = tpa_info->data;
f95c89
 	data_ptr = tpa_info->data_ptr;
f95c89
 	prefetch(data_ptr);
f95c89
 	len = tpa_info->len;
f95c89
 	mapping = tpa_info->mapping;
f95c89
 
f95c89
-	agg_bufs = TPA_END_AGG_BUFS(tpa_end);
f95c89
-
f95c89
-	if (agg_bufs) {
f95c89
-		idx = RING_CMP(*raw_cons);
f95c89
-		if (!bnxt_agg_bufs_valid(bp, cpr, agg_bufs, raw_cons))
f95c89
-			return ERR_PTR(-EBUSY);
f95c89
-
f95c89
-		*event |= BNXT_AGG_EVENT;
f95c89
-		idx = NEXT_CMP(idx);
f95c89
-	}
f95c89
-
f95c89
 	if (unlikely(agg_bufs > MAX_SKB_FRAGS || TPA_END_ERRORS(tpa_end1))) {
f95c89
 		bnxt_abort_tpa(cpr, idx, agg_bufs);
f95c89
 		if (agg_bufs > MAX_SKB_FRAGS)
f95c89
@@ -1500,7 +1550,7 @@
f95c89
 			(tpa_info->flags2 & RX_CMP_FLAGS2_T_L4_CS_CALC) >> 3;
f95c89
 	}
f95c89
 
f95c89
-	if (TPA_END_GRO(tpa_end))
f95c89
+	if (gro)
f95c89
 		skb = bnxt_gro_skb(bp, tpa_info, tpa_end, tpa_end1, skb);
f95c89
 
f95c89
 	return skb;
f95c89
@@ -10828,7 +10878,7 @@
f95c89
 #endif
f95c89
 	if (BNXT_SUPPORTS_TPA(bp)) {
f95c89
 		bp->gro_func = bnxt_gro_func_5730x;
f95c89
-		if (BNXT_CHIP_P4(bp))
f95c89
+		if (BNXT_CHIP_P4_PLUS(bp))
f95c89
 			bp->gro_func = bnxt_gro_func_5731x;
f95c89
 	}
f95c89
 	if (!BNXT_CHIP_P4_PLUS(bp))