|
Denis Kirjanov |
602a1e |
From e38c4be3b2ef3cc240450b27b6df3f35a4be3d3a Mon Sep 17 00:00:00 2001
|
|
Denis Kirjanov |
602a1e |
From: Stephane Graber <stgraber@ubuntu.com>
|
|
Denis Kirjanov |
602a1e |
Date: Tue, 22 Mar 2022 18:42:06 -0400
|
|
Denis Kirjanov |
602a1e |
Subject: [PATCH 7/8] drivers: net: xgene: Fix regression in CRC stripping
|
|
Denis Kirjanov |
602a1e |
Git-commit: e9e6faeafaa00da1851bcf47912b0f1acae666b4
|
|
Denis Kirjanov |
602a1e |
Patch-mainline: v5.18-rc1
|
|
Denis Kirjanov |
602a1e |
References: git-fixes
|
|
Denis Kirjanov |
602a1e |
|
|
Denis Kirjanov |
602a1e |
All packets on ingress (except for jumbo) are terminated with a 4-bytes
|
|
Denis Kirjanov |
602a1e |
CRC checksum. It's the responsability of the driver to strip those 4
|
|
Denis Kirjanov |
602a1e |
bytes. Unfortunately a change dating back to March 2017 re-shuffled some
|
|
Denis Kirjanov |
602a1e |
code and made the CRC stripping code effectively dead.
|
|
Denis Kirjanov |
602a1e |
|
|
Denis Kirjanov |
602a1e |
This change re-orders that part a bit such that the datalen is
|
|
Denis Kirjanov |
602a1e |
immediately altered if needed.
|
|
Denis Kirjanov |
602a1e |
|
|
Denis Kirjanov |
602a1e |
Fixes: 4902a92270fb ("drivers: net: xgene: Add workaround for errata 10GE_8/ENET_11")
|
|
Denis Kirjanov |
602a1e |
Cc: stable@vger.kernel.org
|
|
Denis Kirjanov |
602a1e |
Signed-off-by: Stephane Graber <stgraber@ubuntu.com>
|
|
Denis Kirjanov |
602a1e |
Tested-by: Stephane Graber <stgraber@ubuntu.com>
|
|
Denis Kirjanov |
602a1e |
Link: https://lore.kernel.org/r/20220322224205.752795-1-stgraber@ubuntu.com
|
|
Denis Kirjanov |
602a1e |
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
Denis Kirjanov |
602a1e |
Signed-off-by: Denis Kirjanov <denis.kirjanov@suse.com>
|
|
Denis Kirjanov |
602a1e |
---
|
|
Denis Kirjanov |
602a1e |
drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 12 +++++++-----
|
|
Denis Kirjanov |
602a1e |
1 file changed, 7 insertions(+), 5 deletions(-)
|
|
Denis Kirjanov |
602a1e |
|
|
Denis Kirjanov |
602a1e |
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
|
|
Denis Kirjanov |
602a1e |
index 2123046fd853..4f7ef1dceba5 100644
|
|
Denis Kirjanov |
602a1e |
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
|
|
Denis Kirjanov |
602a1e |
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
|
|
Denis Kirjanov |
602a1e |
@@ -710,6 +710,12 @@ static int xgene_enet_rx_frame(struct xgene_enet_desc_ring *rx_ring,
|
|
Denis Kirjanov |
602a1e |
buf_pool->rx_skb[skb_index] = NULL;
|
|
Denis Kirjanov |
602a1e |
|
|
Denis Kirjanov |
602a1e |
datalen = xgene_enet_get_data_len(le64_to_cpu(raw_desc->m1));
|
|
Denis Kirjanov |
602a1e |
+
|
|
Denis Kirjanov |
602a1e |
+ /* strip off CRC as HW isn't doing this */
|
|
Denis Kirjanov |
602a1e |
+ nv = GET_VAL(NV, le64_to_cpu(raw_desc->m0));
|
|
Denis Kirjanov |
602a1e |
+ if (!nv)
|
|
Denis Kirjanov |
602a1e |
+ datalen -= 4;
|
|
Denis Kirjanov |
602a1e |
+
|
|
Denis Kirjanov |
602a1e |
skb_put(skb, datalen);
|
|
Denis Kirjanov |
602a1e |
prefetch(skb->data - NET_IP_ALIGN);
|
|
Denis Kirjanov |
602a1e |
skb->protocol = eth_type_trans(skb, ndev);
|
|
Denis Kirjanov |
602a1e |
@@ -731,12 +737,8 @@ static int xgene_enet_rx_frame(struct xgene_enet_desc_ring *rx_ring,
|
|
Denis Kirjanov |
602a1e |
}
|
|
Denis Kirjanov |
602a1e |
}
|
|
Denis Kirjanov |
602a1e |
|
|
Denis Kirjanov |
602a1e |
- nv = GET_VAL(NV, le64_to_cpu(raw_desc->m0));
|
|
Denis Kirjanov |
602a1e |
- if (!nv) {
|
|
Denis Kirjanov |
602a1e |
- /* strip off CRC as HW isn't doing this */
|
|
Denis Kirjanov |
602a1e |
- datalen -= 4;
|
|
Denis Kirjanov |
602a1e |
+ if (!nv)
|
|
Denis Kirjanov |
602a1e |
goto skip_jumbo;
|
|
Denis Kirjanov |
602a1e |
- }
|
|
Denis Kirjanov |
602a1e |
|
|
Denis Kirjanov |
602a1e |
slots = page_pool->slots - 1;
|
|
Denis Kirjanov |
602a1e |
head = page_pool->head;
|
|
Denis Kirjanov |
602a1e |
--
|
|
Denis Kirjanov |
602a1e |
2.16.4
|
|
Denis Kirjanov |
602a1e |
|