diff options
author | Rajesh Borundia <rajesh.borundia@qlogic.com> | 2014-08-04 11:51:16 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-08-05 19:23:26 -0400 |
commit | a0eaf75c03712b491b7a840b5836c8f1e2a09277 (patch) | |
tree | 7a6429676a00dafdbd99da7f2abaf1f4f51ca8b3 /drivers/net/ethernet/qlogic/qlcnic | |
parent | f2294eb59d5c3efa51acb3f42a7a382e9353bdc7 (diff) |
qlcnic: Fix update of ethtool stats.
o Aggregating tx stats in adapter variable was resulting in
an increase in stats even after no traffic was run and
user runs ifconfig/ethtool command.
o qlcnic_update_stats used to accumulate stats in adapter
struct at each function call, instead accumulate tx stats
in local variable and then assign it to adapter structure.
Reported-by: Holger Kiehl <holger.kiehl@dwd.de>
Signed-off-by: Rajesh Borundia <rajesh.borundia@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/qlogic/qlcnic')
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c index 1b7f3dbae289..141f116eb868 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | |||
@@ -1290,17 +1290,25 @@ static u64 *qlcnic_fill_stats(u64 *data, void *stats, int type) | |||
1290 | 1290 | ||
1291 | void qlcnic_update_stats(struct qlcnic_adapter *adapter) | 1291 | void qlcnic_update_stats(struct qlcnic_adapter *adapter) |
1292 | { | 1292 | { |
1293 | struct qlcnic_tx_queue_stats tx_stats; | ||
1293 | struct qlcnic_host_tx_ring *tx_ring; | 1294 | struct qlcnic_host_tx_ring *tx_ring; |
1294 | int ring; | 1295 | int ring; |
1295 | 1296 | ||
1297 | memset(&tx_stats, 0, sizeof(tx_stats)); | ||
1296 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) { | 1298 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) { |
1297 | tx_ring = &adapter->tx_ring[ring]; | 1299 | tx_ring = &adapter->tx_ring[ring]; |
1298 | adapter->stats.xmit_on += tx_ring->tx_stats.xmit_on; | 1300 | tx_stats.xmit_on += tx_ring->tx_stats.xmit_on; |
1299 | adapter->stats.xmit_off += tx_ring->tx_stats.xmit_off; | 1301 | tx_stats.xmit_off += tx_ring->tx_stats.xmit_off; |
1300 | adapter->stats.xmitcalled += tx_ring->tx_stats.xmit_called; | 1302 | tx_stats.xmit_called += tx_ring->tx_stats.xmit_called; |
1301 | adapter->stats.xmitfinished += tx_ring->tx_stats.xmit_finished; | 1303 | tx_stats.xmit_finished += tx_ring->tx_stats.xmit_finished; |
1302 | adapter->stats.txbytes += tx_ring->tx_stats.tx_bytes; | 1304 | tx_stats.tx_bytes += tx_ring->tx_stats.tx_bytes; |
1303 | } | 1305 | } |
1306 | |||
1307 | adapter->stats.xmit_on = tx_stats.xmit_on; | ||
1308 | adapter->stats.xmit_off = tx_stats.xmit_off; | ||
1309 | adapter->stats.xmitcalled = tx_stats.xmit_called; | ||
1310 | adapter->stats.xmitfinished = tx_stats.xmit_finished; | ||
1311 | adapter->stats.txbytes = tx_stats.tx_bytes; | ||
1304 | } | 1312 | } |
1305 | 1313 | ||
1306 | static u64 *qlcnic_fill_tx_queue_stats(u64 *data, void *stats) | 1314 | static u64 *qlcnic_fill_tx_queue_stats(u64 *data, void *stats) |