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

net: ftgmac100: Disable hardware checksum on AST2600

The AST2600 when using the i210 NIC over NC-SI has been observed to
produce incorrect checksum results with specific MTU values. This was
first observed when sending data across a long distance set of networks.

On a local network, the following test was performed using a 1MB file of
random data.

On the receiver run this script:

#!/bin/bash
while [ 1 ]; do
# Zero the stats
nstat -r > /dev/null
nc -l 9899 > test-file
# Check for checksum errors
TcpInCsumErrors=$(nstat | grep TcpInCsumErrors)
if [ -z "$TcpInCsumErrors" ]; then
echo No TcpInCsumErrors
else
echo TcpInCsumErrors = $TcpInCsumErrors
fi
done

On an AST2600 system:

# nc <IP of receiver host> 9899 < test-file

The test was repeated with various MTU values:

# ip link set mtu 1410 dev eth0

The observed results:

1500 - good
1434 - bad
1400 - good
1410 - bad
1420 - good

The test was repeated after disabling tx checksumming:

# ethtool -K eth0 tx-checksumming off

And all MTU values tested resulted in transfers without error.

An issue with the driver cannot be ruled out, however there has been no
bug discovered so far.

David has done the work to take the original bug report of slow data
transfer between long distance connections and triaged it down to this
test case.

The vendor suspects this this is a hardware issue when using NC-SI. The
fixes line refers to the patch that introduced AST2600 support.

Reported-by: David Wilder <wilder@us.ibm.com>
Reviewed-by: Dylan Hung <dylan_hung@aspeedtech.com>
Signed-off-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Joel Stanley and committed by
David S. Miller
6fd45e79 942d2ad5

+5
+5
drivers/net/ethernet/faraday/ftgmac100.c
··· 1928 1928 /* AST2400 doesn't have working HW checksum generation */ 1929 1929 if (np && (of_device_is_compatible(np, "aspeed,ast2400-mac"))) 1930 1930 netdev->hw_features &= ~NETIF_F_HW_CSUM; 1931 + 1932 + /* AST2600 tx checksum with NCSI is broken */ 1933 + if (priv->use_ncsi && of_device_is_compatible(np, "aspeed,ast2600-mac")) 1934 + netdev->hw_features &= ~NETIF_F_HW_CSUM; 1935 + 1931 1936 if (np && of_get_property(np, "no-hw-checksum", NULL)) 1932 1937 netdev->hw_features &= ~(NETIF_F_HW_CSUM | NETIF_F_RXCSUM); 1933 1938 netdev->features |= netdev->hw_features;