summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@osdl.org>2005-06-26 22:02:44 (GMT)
committerJeff Garzik <jgarzik@pobox.com>2005-06-26 22:02:44 (GMT)
commit97f568d8e3dc031b092e6086c0534d5411fb2cf5 (patch)
tree626d9dd89a55cc7515b5c1f070acceb82a72f7a6
parent223d47278a77091b62e7d063e95860f63ca55e20 (diff)
downloadlinux-97f568d8e3dc031b092e6086c0534d5411fb2cf5.tar.xz
8139cp: safer spin loop for get_statistics
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.
-rw-r--r--drivers/net/8139cp.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c
index ca7746d..e4b3c5c 100644
--- a/drivers/net/8139cp.c
+++ b/drivers/net/8139cp.c
@@ -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);