qlcnic: Fix update of ethtool stats.
authorRajesh Borundia <rajesh.borundia@qlogic.com>
Mon, 4 Aug 2014 15:51:16 +0000 (11:51 -0400)
committerDavid S. Miller <davem@davemloft.net>
Tue, 5 Aug 2014 23:23:26 +0000 (16:23 -0700)
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>
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c

index 1b7f3dbae2899d9ade666176a7cfdb0e21a82d6f..141f116eb868bfe5569e5693a73c6266ef41ff90 100644 (file)
@@ -1290,17 +1290,25 @@ static u64 *qlcnic_fill_stats(u64 *data, void *stats, int type)
 
 void qlcnic_update_stats(struct qlcnic_adapter *adapter)
 {
+       struct qlcnic_tx_queue_stats tx_stats;
        struct qlcnic_host_tx_ring *tx_ring;
        int ring;
 
+       memset(&tx_stats, 0, sizeof(tx_stats));
        for (ring = 0; ring < adapter->drv_tx_rings; ring++) {
                tx_ring = &adapter->tx_ring[ring];
-               adapter->stats.xmit_on += tx_ring->tx_stats.xmit_on;
-               adapter->stats.xmit_off += tx_ring->tx_stats.xmit_off;
-               adapter->stats.xmitcalled += tx_ring->tx_stats.xmit_called;
-               adapter->stats.xmitfinished += tx_ring->tx_stats.xmit_finished;
-               adapter->stats.txbytes += tx_ring->tx_stats.tx_bytes;
+               tx_stats.xmit_on += tx_ring->tx_stats.xmit_on;
+               tx_stats.xmit_off += tx_ring->tx_stats.xmit_off;
+               tx_stats.xmit_called += tx_ring->tx_stats.xmit_called;
+               tx_stats.xmit_finished += tx_ring->tx_stats.xmit_finished;
+               tx_stats.tx_bytes += tx_ring->tx_stats.tx_bytes;
        }
+
+       adapter->stats.xmit_on = tx_stats.xmit_on;
+       adapter->stats.xmit_off = tx_stats.xmit_off;
+       adapter->stats.xmitcalled = tx_stats.xmit_called;
+       adapter->stats.xmitfinished = tx_stats.xmit_finished;
+       adapter->stats.txbytes = tx_stats.tx_bytes;
 }
 
 static u64 *qlcnic_fill_tx_queue_stats(u64 *data, void *stats)