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