]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sky2: fix checksum bit management on some chips
authorstephen hemminger <shemminger@vyatta.com>
Wed, 6 Jun 2012 10:01:30 +0000 (10:01 +0000)
committerGuangyu Sun <guangyu.sun@oracle.com>
Thu, 4 Oct 2012 22:22:02 +0000 (15:22 -0700)
[ Upstream commit 5ff0feac88ced864f44adb145142269196fa79d9 ]

The newer flavors of Yukon II use a different method for receive
checksum offload. This is indicated in the driver by the SKY2_HW_NEW_LE
flag. On these newer chips, the BMU_ENA_RX_CHKSUM should not be set.

The driver would get incorrectly toggle the bit, enabling the old
checksum logic on these chips and cause a BUG_ON() assertion. If
receive checksum was toggled via ethtool.

Reported-by: Kirill Smelkov <kirr@mns.spb.ru>
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Guangyu Sun <guangyu.sun@oracle.com>
drivers/net/sky2.c

index e40d815e5bd956470e92c76c873ad36a0a1874ae..dd5fe74cc1141cdac5e045057d588c420e140992 100644 (file)
@@ -4207,10 +4207,12 @@ static int sky2_set_features(struct net_device *dev, u32 features)
        struct sky2_port *sky2 = netdev_priv(dev);
        u32 changed = dev->features ^ features;
 
-       if (changed & NETIF_F_RXCSUM) {
-               u32 on = features & NETIF_F_RXCSUM;
-               sky2_write32(sky2->hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR),
-                            on ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM);
+       if ((changed & NETIF_F_RXCSUM) &&
+           !(sky2->hw->flags & SKY2_HW_NEW_LE)) {
+               sky2_write32(sky2->hw,
+                            Q_ADDR(rxqaddr[sky2->port], Q_CSR),
+                            (features & NETIF_F_RXCSUM)
+                            ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM);
        }
 
        if (changed & NETIF_F_RXHASH)