Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mlxsw: Enable Tx checksum offload

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>

authored by

Ido Schimmel and committed by
Jakub Kicinski
907dd32b 3337064f

+11 -2
+2
drivers/net/ethernet/mellanox/mlxsw/pci.c
··· 2214 2214 for (i++; i < MLXSW_PCI_WQE_SG_ENTRIES; i++) 2215 2215 mlxsw_pci_wqe_byte_count_set(wqe, i, 0); 2216 2216 2217 + mlxsw_pci_wqe_ipcs_set(wqe, skb->ip_summed == CHECKSUM_PARTIAL); 2218 + 2217 2219 /* Everything is set up, ring producer doorbell to get HW going */ 2218 2220 q->producer_counter++; 2219 2221 mlxsw_pci_queue_doorbell_producer_ring(mlxsw_pci, q);
+5
drivers/net/ethernet/mellanox/mlxsw/pci_hw.h
··· 90 90 */ 91 91 MLXSW_ITEM32(pci, wqe, type, 0x00, 23, 4); 92 92 93 + /* pci_wqe_ipcs 94 + * Calculate IPv4 and TCP / UDP checksums. 95 + */ 96 + MLXSW_ITEM32(pci, wqe, ipcs, 0x00, 14, 1); 97 + 93 98 /* pci_wqe_byte_count 94 99 * Size of i-th scatter/gather entry, 0 if entry is unused. 95 100 */
+4 -2
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
··· 1574 1574 netif_carrier_off(dev); 1575 1575 1576 1576 dev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_CTAG_FILTER | 1577 - NETIF_F_HW_TC; 1578 - dev->hw_features |= NETIF_F_HW_TC | NETIF_F_LOOPBACK; 1577 + NETIF_F_HW_TC | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; 1578 + dev->hw_features |= NETIF_F_HW_TC | NETIF_F_LOOPBACK | 1579 + NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; 1580 + dev->vlan_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; 1579 1581 dev->lltx = true; 1580 1582 dev->netns_local = true; 1581 1583