]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mlxsw: Enable Tx checksum offload
authorIdo Schimmel <idosch@nvidia.com>
Fri, 7 Feb 2025 18:00:44 +0000 (19:00 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 11 Feb 2025 03:10:51 +0000 (19:10 -0800)
The device is able to checksum plain TCP / UDP packets over IPv4 / IPv6
when the 'ipcs' bit in the send descriptor is set. Advertise support for
the 'NETIF_F_IP{,6}_CSUM' features in net devices registered by the
driver and VLAN uppers and set the 'ipcs' bit when the stack requests Tx
checksum offload.

Note that the device also calculates the IPv4 checksum, but it first
zeroes the current checksum so there should not be any difference
compared to the checksum calculated by the kernel.

On SN5600 (Spectrum-4) there is about 10% improvement in Tx packet rate
with 1400 byte packets when using pktgen.

Tested on Spectrum-{1,2,3,4} with all the combinations of IPv4 / IPv6,
TCP / UDP, with and without VLAN.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/8dc86c95474ce10572a0fa83b8adb0259558e982.1738950446.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlxsw/pci.c
drivers/net/ethernet/mellanox/mlxsw/pci_hw.h
drivers/net/ethernet/mellanox/mlxsw/spectrum.c

index 5b44c931b6604822009b2381c16419678da4492d..058dcabfaa2e4c93cd1bdc8a66a52e396eccd4e8 100644 (file)
@@ -2214,6 +2214,8 @@ static int mlxsw_pci_skb_transmit(void *bus_priv, struct sk_buff *skb,
        for (i++; i < MLXSW_PCI_WQE_SG_ENTRIES; i++)
                mlxsw_pci_wqe_byte_count_set(wqe, i, 0);
 
+       mlxsw_pci_wqe_ipcs_set(wqe, skb->ip_summed == CHECKSUM_PARTIAL);
+
        /* Everything is set up, ring producer doorbell to get HW going */
        q->producer_counter++;
        mlxsw_pci_queue_doorbell_producer_ring(mlxsw_pci, q);
index 6bed495dcf0ff5c37eca31a7943c7053ff36d74c..7fa94e5828deb7a00ea3a1cc2a670fffe1da9224 100644 (file)
@@ -90,6 +90,11 @@ MLXSW_ITEM32(pci, wqe, lp, 0x00, 30, 1);
  */
 MLXSW_ITEM32(pci, wqe, type, 0x00, 23, 4);
 
+/* pci_wqe_ipcs
+ * Calculate IPv4 and TCP / UDP checksums.
+ */
+MLXSW_ITEM32(pci, wqe, ipcs, 0x00, 14, 1);
+
 /* pci_wqe_byte_count
  * Size of i-th scatter/gather entry, 0 if entry is unused.
  */
index d714311fd884e3c81a1a73b8f3c38fb799f8884f..1f8362788c7564b26c00db3b255680aeeda4be94 100644 (file)
@@ -1574,8 +1574,10 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u16 local_port,
        netif_carrier_off(dev);
 
        dev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_CTAG_FILTER |
-                        NETIF_F_HW_TC;
-       dev->hw_features |= NETIF_F_HW_TC | NETIF_F_LOOPBACK;
+                        NETIF_F_HW_TC | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
+       dev->hw_features |= NETIF_F_HW_TC | NETIF_F_LOOPBACK |
+                           NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
+       dev->vlan_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
        dev->lltx = true;
        dev->netns_local = true;