]> err.no Git - linux-2.6/commitdiff
8139cp: safer spin loop for get_statistics
authorStephen Hemminger <shemminger@osdl.org>
Sun, 26 Jun 2005 22:02:44 +0000 (18:02 -0400)
committerJeff Garzik <jgarzik@pobox.com>
Sun, 26 Jun 2005 22:02:44 +0000 (18:02 -0400)
The spin loop in 8139cp is limited to 100 iterations when pulling hardware
stats. There is no allowance for processor speed so on a fast machine, the
stats may not be available that fast. Also, if the board doesn't return
soon enough make sure turn the address back off to prevent later updates
when memory has gone away.

drivers/net/8139cp.c

index ca7746dd164f1e1a1b32c67b25d2dce82f9ab50c..e4b3c5c88542dbf8be95324c5a4c2007b1e6f033 100644 (file)
@@ -1516,22 +1516,22 @@ static void cp_get_ethtool_stats (struct net_device *dev,
                                  struct ethtool_stats *estats, u64 *tmp_stats)
 {
        struct cp_private *cp = netdev_priv(dev);
-       unsigned int work = 100;
        int i;
 
+       memset(cp->nic_stats, 0, sizeof(struct cp_dma_stats));
+
        /* begin NIC statistics dump */
        cpw32(StatsAddr + 4, (cp->nic_stats_dma >> 16) >> 16);
        cpw32(StatsAddr, (cp->nic_stats_dma & 0xffffffff) | DumpStats);
        cpr32(StatsAddr);
 
-       while (work-- > 0) {
+       for (i = 0; i < 1000; i++) {
                if ((cpr32(StatsAddr) & DumpStats) == 0)
                        break;
-               cpu_relax();
+               udelay(10);
        }
-
-       if (cpr32(StatsAddr) & DumpStats)
-               return /* -EIO */;
+       cpw32(StatsAddr, 0);
+       cpw32(StatsAddr + 4, 0);
 
        i = 0;
        tmp_stats[i++] = le64_to_cpu(cp->nic_stats->tx_ok);