diff options
author | Breno Leitao <leitao@linux.vnet.ibm.com> | 2008-07-22 15:27:20 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-07-29 18:24:30 -0400 |
commit | dc56e634c807c6be69be8af919f20a746197b87d (patch) | |
tree | 1357c28fa017eca6ee8ed40eb751d02f12469659 /drivers | |
parent | c7b7b042068cd12b8b155722d24686f70b88ced1 (diff) |
S2io: fix statistics flush after a MTU change
On s2io driver, when you change the interface MTU, it invokes a card
reset, which flush some statistics. This patch solves this problem, and
also set the net_device->stats as the default statistics structure,
instead of s2io_nic->stats.
To do that, s2io_nic->stats turned into a staging area, where is saved
statistics of the last hardware statistics query. So, the difference
between the current hardware statistics and s2io_nic->stats, is the
value that should be summed up, in order to get the correct statistics
value, even after a reset.
Signed-off-by: Breno Leitao <leitao@linux.vnet.ibm.com>
Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/s2io.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index 86d77d05190a..a2b073097e5c 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -3143,7 +3143,7 @@ static void tx_intr_handler(struct fifo_info *fifo_data) | |||
3143 | pkt_cnt++; | 3143 | pkt_cnt++; |
3144 | 3144 | ||
3145 | /* Updating the statistics block */ | 3145 | /* Updating the statistics block */ |
3146 | nic->stats.tx_bytes += skb->len; | 3146 | nic->dev->stats.tx_bytes += skb->len; |
3147 | nic->mac_control.stats_info->sw_stat.mem_freed += skb->truesize; | 3147 | nic->mac_control.stats_info->sw_stat.mem_freed += skb->truesize; |
3148 | dev_kfree_skb_irq(skb); | 3148 | dev_kfree_skb_irq(skb); |
3149 | 3149 | ||
@@ -4896,25 +4896,42 @@ static struct net_device_stats *s2io_get_stats(struct net_device *dev) | |||
4896 | /* Configure Stats for immediate updt */ | 4896 | /* Configure Stats for immediate updt */ |
4897 | s2io_updt_stats(sp); | 4897 | s2io_updt_stats(sp); |
4898 | 4898 | ||
4899 | /* Using sp->stats as a staging area, because reset (due to mtu | ||
4900 | change, for example) will clear some hardware counters */ | ||
4901 | dev->stats.tx_packets += | ||
4902 | le32_to_cpu(mac_control->stats_info->tmac_frms) - | ||
4903 | sp->stats.tx_packets; | ||
4899 | sp->stats.tx_packets = | 4904 | sp->stats.tx_packets = |
4900 | le32_to_cpu(mac_control->stats_info->tmac_frms); | 4905 | le32_to_cpu(mac_control->stats_info->tmac_frms); |
4906 | dev->stats.tx_errors += | ||
4907 | le32_to_cpu(mac_control->stats_info->tmac_any_err_frms) - | ||
4908 | sp->stats.tx_errors; | ||
4901 | sp->stats.tx_errors = | 4909 | sp->stats.tx_errors = |
4902 | le32_to_cpu(mac_control->stats_info->tmac_any_err_frms); | 4910 | le32_to_cpu(mac_control->stats_info->tmac_any_err_frms); |
4911 | dev->stats.rx_errors += | ||
4912 | le64_to_cpu(mac_control->stats_info->rmac_drop_frms) - | ||
4913 | sp->stats.rx_errors; | ||
4903 | sp->stats.rx_errors = | 4914 | sp->stats.rx_errors = |
4904 | le64_to_cpu(mac_control->stats_info->rmac_drop_frms); | 4915 | le64_to_cpu(mac_control->stats_info->rmac_drop_frms); |
4916 | dev->stats.multicast = | ||
4917 | le32_to_cpu(mac_control->stats_info->rmac_vld_mcst_frms) - | ||
4918 | sp->stats.multicast; | ||
4905 | sp->stats.multicast = | 4919 | sp->stats.multicast = |
4906 | le32_to_cpu(mac_control->stats_info->rmac_vld_mcst_frms); | 4920 | le32_to_cpu(mac_control->stats_info->rmac_vld_mcst_frms); |
4921 | dev->stats.rx_length_errors = | ||
4922 | le64_to_cpu(mac_control->stats_info->rmac_long_frms) - | ||
4923 | sp->stats.rx_length_errors; | ||
4907 | sp->stats.rx_length_errors = | 4924 | sp->stats.rx_length_errors = |
4908 | le64_to_cpu(mac_control->stats_info->rmac_long_frms); | 4925 | le64_to_cpu(mac_control->stats_info->rmac_long_frms); |
4909 | 4926 | ||
4910 | /* collect per-ring rx_packets and rx_bytes */ | 4927 | /* collect per-ring rx_packets and rx_bytes */ |
4911 | sp->stats.rx_packets = sp->stats.rx_bytes = 0; | 4928 | dev->stats.rx_packets = dev->stats.rx_bytes = 0; |
4912 | for (i = 0; i < config->rx_ring_num; i++) { | 4929 | for (i = 0; i < config->rx_ring_num; i++) { |
4913 | sp->stats.rx_packets += mac_control->rings[i].rx_packets; | 4930 | dev->stats.rx_packets += mac_control->rings[i].rx_packets; |
4914 | sp->stats.rx_bytes += mac_control->rings[i].rx_bytes; | 4931 | dev->stats.rx_bytes += mac_control->rings[i].rx_bytes; |
4915 | } | 4932 | } |
4916 | 4933 | ||
4917 | return (&sp->stats); | 4934 | return (&dev->stats); |
4918 | } | 4935 | } |
4919 | 4936 | ||
4920 | /** | 4937 | /** |
@@ -7419,7 +7436,7 @@ static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp) | |||
7419 | if (err_mask != 0x5) { | 7436 | if (err_mask != 0x5) { |
7420 | DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%x\n", | 7437 | DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%x\n", |
7421 | dev->name, err_mask); | 7438 | dev->name, err_mask); |
7422 | sp->stats.rx_crc_errors++; | 7439 | dev->stats.rx_crc_errors++; |
7423 | sp->mac_control.stats_info->sw_stat.mem_freed | 7440 | sp->mac_control.stats_info->sw_stat.mem_freed |
7424 | += skb->truesize; | 7441 | += skb->truesize; |
7425 | dev_kfree_skb(skb); | 7442 | dev_kfree_skb(skb); |