mirror of https://github.com/openwrt/openwrt.git
79 lines
2.7 KiB
Diff
79 lines
2.7 KiB
Diff
From f8001196455311eb128fcafd98cb2050a70218df Mon Sep 17 00:00:00 2001
|
|
From: Linus Walleij <linus.walleij@linaro.org>
|
|
Date: Sat, 6 Jan 2024 01:12:22 +0100
|
|
Subject: [PATCH 4/4] net: ethernet: cortina: Drop TSO support
|
|
|
|
The recent change to allow large frames without hardware checksumming
|
|
slotted in software checksumming in the driver if hardware could not
|
|
do it.
|
|
|
|
This will however upset TSO (TCP Segment Offloading). Typical
|
|
error dumps includes this:
|
|
|
|
skb len=2961 headroom=222 headlen=66 tailroom=0
|
|
(...)
|
|
WARNING: CPU: 0 PID: 956 at net/core/dev.c:3259 skb_warn_bad_offload+0x7c/0x108
|
|
gemini-ethernet-port: caps=(0x0000010000154813, 0x00002007ffdd7889)
|
|
|
|
And the packets do not go through.
|
|
|
|
The TSO implementation is bogus: a TSO enabled driver must propagate
|
|
the skb_shinfo(skb)->gso_size value to the TSO engine on the NIC.
|
|
|
|
Drop the size check and TSO offloading features for now: this
|
|
needs to be fixed up properly.
|
|
|
|
After this ethernet works fine on Gemini devices with a direct connected
|
|
PHY such as D-Link DNS-313.
|
|
|
|
Also tested to still be working with a DSA switch using the Gemini
|
|
ethernet as conduit interface.
|
|
|
|
Link: https://lore.kernel.org/netdev/CANn89iJLfxng1sYL5Zk0mknXpyYQPCp83m3KgD2KJ2_hKCpEUg@mail.gmail.com/
|
|
Suggested-by: Eric Dumazet <edumazet@google.com>
|
|
Fixes: d4d0c5b4d279 ("net: ethernet: cortina: Handle large frames")
|
|
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
|
Reviewed-by: Eric Dumazet <edumazet@google.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
drivers/net/ethernet/cortina/gemini.c | 15 ++-------------
|
|
1 file changed, 2 insertions(+), 13 deletions(-)
|
|
|
|
--- a/drivers/net/ethernet/cortina/gemini.c
|
|
+++ b/drivers/net/ethernet/cortina/gemini.c
|
|
@@ -79,8 +79,7 @@ MODULE_PARM_DESC(debug, "Debug level (0=
|
|
#define GMAC0_IRQ4_8 (GMAC0_MIB_INT_BIT | GMAC0_RX_OVERRUN_INT_BIT)
|
|
|
|
#define GMAC_OFFLOAD_FEATURES (NETIF_F_SG | NETIF_F_IP_CSUM | \
|
|
- NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM | \
|
|
- NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6)
|
|
+ NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM)
|
|
|
|
/**
|
|
* struct gmac_queue_page - page buffer per-page info
|
|
@@ -1148,23 +1147,13 @@ static int gmac_map_tx_bufs(struct net_d
|
|
struct gmac_txdesc *txd;
|
|
skb_frag_t *skb_frag;
|
|
dma_addr_t mapping;
|
|
- unsigned short mtu;
|
|
void *buffer;
|
|
int ret;
|
|
|
|
- mtu = ETH_HLEN;
|
|
- mtu += netdev->mtu;
|
|
- if (skb->protocol == htons(ETH_P_8021Q))
|
|
- mtu += VLAN_HLEN;
|
|
-
|
|
+ /* TODO: implement proper TSO using MTU in word3 */
|
|
word1 = skb->len;
|
|
word3 = SOF_BIT;
|
|
|
|
- if (word1 > mtu) {
|
|
- word1 |= TSS_MTU_ENABLE_BIT;
|
|
- word3 |= mtu;
|
|
- }
|
|
-
|
|
if (skb->len >= ETH_FRAME_LEN) {
|
|
/* Hardware offloaded checksumming isn't working on frames
|
|
* bigger than 1514 bytes. A hypothesis about this is that the
|