diff options
author | Jon Cooper <jcooper@solarflare.com> | 2013-09-30 17:36:50 +0100 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2013-12-12 22:06:51 +0000 |
commit | f8f3b5ae3ea45ef6b00b471fed0fc90552a3c4af (patch) | |
tree | e65cedae54bb32528176a2d31890ee86cd6db62d /drivers/net/ethernet/sfc/efx.c | |
parent | cce28794bc99c15f0d4c98936a473ac6e21be0ad (diff) | |
download | lwn-f8f3b5ae3ea45ef6b00b471fed0fc90552a3c4af.tar.gz lwn-f8f3b5ae3ea45ef6b00b471fed0fc90552a3c4af.zip |
sfc: Correct RX dropped count for drops while interface is down
We don't directly control RX ingress on Siena or any later
controllers, and so we cannot prevent packets from entering the RX
datapath while the RX queues are not set up. This results in
the hardware incrementing RX_NODESC_DROP_CNT, but it's not an
error and we should not include it in error stats.
When bringing an interface up or down, pull (or wait for) stats and
count the number of packets that were dropped while the interface was
down. Subtract this from the reported RX dropped count.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'drivers/net/ethernet/sfc/efx.c')
-rw-r--r-- | drivers/net/ethernet/sfc/efx.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c index 5e2454d07137..c734fba8c99c 100644 --- a/drivers/net/ethernet/sfc/efx.c +++ b/drivers/net/ethernet/sfc/efx.c @@ -1684,6 +1684,10 @@ static void efx_start_all(struct efx_nic *efx) } efx->type->start_stats(efx); + efx->type->pull_stats(efx); + spin_lock_bh(&efx->stats_lock); + efx->type->update_stats(efx, NULL, NULL); + spin_unlock_bh(&efx->stats_lock); } /* Flush all delayed work. Should only be called when no more delayed work @@ -1711,6 +1715,13 @@ static void efx_stop_all(struct efx_nic *efx) if (!efx->port_enabled) return; + /* update stats before we go down so we can accurately count + * rx_nodesc_drops + */ + efx->type->pull_stats(efx); + spin_lock_bh(&efx->stats_lock); + efx->type->update_stats(efx, NULL, NULL); + spin_unlock_bh(&efx->stats_lock); efx->type->stop_stats(efx); efx_stop_port(efx); |