]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
sky2: dual-port pci-x checksum fix
authorStephen Hemminger <shemminger@linux-foundation.org>
Thu, 22 Feb 2007 20:07:51 +0000 (21:07 +0100)
committerAdrian Bunk <bunk@stusta.de>
Thu, 22 Feb 2007 20:07:51 +0000 (21:07 +0100)
Add a workaround for dual port PCI-X card that returns status out of
order sometimes because of split transactions.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: Adrian Bunk <bunk@stusta.de>
drivers/net/sky2.c

index 171443f9fc74ddf3d35e2ad71f90283b2c1276de..bc1d052f8f20cf5579ee63187c56476df83f2042 100644 (file)
@@ -1031,7 +1031,25 @@ static int sky2_up(struct net_device *dev)
        struct sky2_hw *hw = sky2->hw;
        unsigned port = sky2->port;
        u32 ramsize, rxspace;
-       int err = -ENOMEM;
+       int cap, err = -ENOMEM;
+       struct net_device *otherdev = hw->dev[sky2->port^1];
+
+       /*
+        * On dual port PCI-X card, there is an problem where status
+        * can be received out of order due to split transactions
+        */
+       if (otherdev && netif_running(otherdev) &&
+           (cap = pci_find_capability(hw->pdev, PCI_CAP_ID_PCIX))) {
+               struct sky2_port *osky2 = netdev_priv(otherdev);
+               u16 cmd;
+
+               cmd = sky2_pci_read16(hw, cap + PCI_X_CMD);
+               cmd &= ~PCI_X_CMD_MAX_SPLIT;
+               sky2_pci_write16(hw, cap + PCI_X_CMD, cmd);
+
+               sky2->rx_csum = 0;
+               osky2->rx_csum = 0;
+       }
 
        if (netif_msg_ifup(sky2))
                printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);