]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: ravb: Enable IPv6 TX checksum offload for GbEth
authorPaul Barker <paul.barker.ct@bp.renesas.com>
Tue, 15 Oct 2024 13:36:33 +0000 (14:36 +0100)
committerAndrew Lunn <andrew@lunn.ch>
Fri, 18 Oct 2024 02:24:25 +0000 (21:24 -0500)
The GbEth IP supports offloading IPv6 TCP, UDP & ICMPv6 checksums in the
TX path.

Signed-off-by: Paul Barker <paul.barker.ct@bp.renesas.com>
Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
drivers/net/ethernet/renesas/ravb.h
drivers/net/ethernet/renesas/ravb_main.c

index e1e55e677215687ab91995b726910cc63344c7a8..d7b3810ce21b46adb77031a799fa79bdd78e2cae 100644 (file)
@@ -998,7 +998,7 @@ enum CSR1_BIT {
        CSR1_TDHD       = 0x08000000,
 };
 
-#define CSR1_CSUM_ENABLE (CSR1_TTCP4 | CSR1_TUDP4)
+#define CSR1_CSUM_ENABLE (CSR1_TTCP4 | CSR1_TUDP4 | CSR1_TTCP6 | CSR1_TUDP6)
 
 enum CSR2_BIT {
        CSR2_RIP4       = 0x00000001,
index 80c0d36bffcb89a278ed7cdf16e370d5af463c8e..14b4462331b0796a186d8acf175ccb89b2855944 100644 (file)
@@ -2063,17 +2063,24 @@ out_unlock:
 
 static bool ravb_can_tx_csum_gbeth(struct sk_buff *skb)
 {
-       struct iphdr *ip = ip_hdr(skb);
+       u8 inner_protocol;
 
        /* TODO: Need to add support for VLAN tag 802.1Q */
        if (skb_vlan_tag_present(skb))
                return false;
 
-       /* TODO: Need to add hardware checksum for IPv6 */
-       if (skb->protocol != htons(ETH_P_IP))
+       switch (ntohs(skb->protocol)) {
+       case ETH_P_IP:
+               inner_protocol = ip_hdr(skb)->protocol;
+               break;
+       case ETH_P_IPV6:
+               inner_protocol = ipv6_hdr(skb)->nexthdr;
+               break;
+       default:
                return false;
+       }
 
-       switch (ip->protocol) {
+       switch (inner_protocol) {
        case IPPROTO_TCP:
        case IPPROTO_UDP:
                return true;