]> git.itanic.dy.fi Git - linux-stable/commitdiff
net: ethernet: cortina: Drop TSO support
authorLinus Walleij <linus.walleij@linaro.org>
Sat, 6 Jan 2024 00:12:22 +0000 (01:12 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sun, 7 Jan 2024 16:05:00 +0000 (16:05 +0000)
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

index 78287cfcbf6388f01bfab417c264f41f3a1a16f2..705c3eb19cd3f4a9af06b0e795e832a080ccac1b 100644 (file)
@@ -79,8 +79,7 @@ MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
 #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
@@ -1143,23 +1142,13 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb,
        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