diff options
Diffstat (limited to 'drivers/net/sfc/siena.c')
| -rw-r--r-- | drivers/net/sfc/siena.c | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/net/sfc/siena.c b/drivers/net/sfc/siena.c index 38dcc42c4f7..e0c46f59d1f 100644 --- a/drivers/net/sfc/siena.c +++ b/drivers/net/sfc/siena.c @@ -456,8 +456,17 @@ static int siena_try_update_nic_stats(struct efx_nic *efx)  static void siena_update_nic_stats(struct efx_nic *efx)  { -	while (siena_try_update_nic_stats(efx) == -EAGAIN) -		cpu_relax(); +	int retry; + +	/* If we're unlucky enough to read statistics wduring the DMA, wait +	 * up to 10ms for it to finish (typically takes <500us) */ +	for (retry = 0; retry < 100; ++retry) { +		if (siena_try_update_nic_stats(efx) == 0) +			return; +		udelay(100); +	} + +	/* Use the old values instead */  }  static void siena_start_nic_stats(struct efx_nic *efx)  |