diff options
author | Ajit Khaparde <ajitk@serverengines.com> | 2009-10-12 21:46:29 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-10-13 14:48:28 -0400 |
commit | 231835e4163cf14c90e295f1729004f571ee1cc7 (patch) | |
tree | bef58063a02c7f5e95f6900821dba6aaee3dcfb8 /drivers/net/igb | |
parent | 8328c38fcda2743249fd142174acf025d4cdd21f (diff) |
igb: Fix erroneous display of stats by ethtool -S
Commit 337e067d overlooked the way offsets for netdev stats were considered.
Because of this some of the stats shown by ethtool -S were wrong.
This patch fixes it.
Signed-off-by: Ajit Khaparde <ajitk@serverengines.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/igb')
-rw-r--r-- | drivers/net/igb/igb_ethtool.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/drivers/net/igb/igb_ethtool.c b/drivers/net/igb/igb_ethtool.c index d46c3212757b..a6da32f25a83 100644 --- a/drivers/net/igb/igb_ethtool.c +++ b/drivers/net/igb/igb_ethtool.c | |||
@@ -37,16 +37,22 @@ | |||
37 | 37 | ||
38 | #include "igb.h" | 38 | #include "igb.h" |
39 | 39 | ||
40 | enum {NETDEV_STATS, IGB_STATS}; | ||
41 | |||
40 | struct igb_stats { | 42 | struct igb_stats { |
41 | char stat_string[ETH_GSTRING_LEN]; | 43 | char stat_string[ETH_GSTRING_LEN]; |
44 | int type; | ||
42 | int sizeof_stat; | 45 | int sizeof_stat; |
43 | int stat_offset; | 46 | int stat_offset; |
44 | }; | 47 | }; |
45 | 48 | ||
46 | #define IGB_STAT(m) FIELD_SIZEOF(struct igb_adapter, m), \ | 49 | #define IGB_STAT(m) IGB_STATS, \ |
47 | offsetof(struct igb_adapter, m) | 50 | FIELD_SIZEOF(struct igb_adapter, m), \ |
48 | #define IGB_NETDEV_STAT(m) FIELD_SIZEOF(struct net_device, m), \ | 51 | offsetof(struct igb_adapter, m) |
49 | offsetof(struct net_device, m) | 52 | #define IGB_NETDEV_STAT(m) NETDEV_STATS, \ |
53 | FIELD_SIZEOF(struct net_device, m), \ | ||
54 | offsetof(struct net_device, m) | ||
55 | |||
50 | static const struct igb_stats igb_gstrings_stats[] = { | 56 | static const struct igb_stats igb_gstrings_stats[] = { |
51 | { "rx_packets", IGB_STAT(stats.gprc) }, | 57 | { "rx_packets", IGB_STAT(stats.gprc) }, |
52 | { "tx_packets", IGB_STAT(stats.gptc) }, | 58 | { "tx_packets", IGB_STAT(stats.gptc) }, |
@@ -1959,10 +1965,21 @@ static void igb_get_ethtool_stats(struct net_device *netdev, | |||
1959 | int stat_count_rx = sizeof(struct igb_rx_queue_stats) / sizeof(u64); | 1965 | int stat_count_rx = sizeof(struct igb_rx_queue_stats) / sizeof(u64); |
1960 | int j; | 1966 | int j; |
1961 | int i; | 1967 | int i; |
1968 | char *p = NULL; | ||
1962 | 1969 | ||
1963 | igb_update_stats(adapter); | 1970 | igb_update_stats(adapter); |
1964 | for (i = 0; i < IGB_GLOBAL_STATS_LEN; i++) { | 1971 | for (i = 0; i < IGB_GLOBAL_STATS_LEN; i++) { |
1965 | char *p = (char *)adapter+igb_gstrings_stats[i].stat_offset; | 1972 | switch (igb_gstrings_stats[i].type) { |
1973 | case NETDEV_STATS: | ||
1974 | p = (char *) netdev + | ||
1975 | igb_gstrings_stats[i].stat_offset; | ||
1976 | break; | ||
1977 | case IGB_STATS: | ||
1978 | p = (char *) adapter + | ||
1979 | igb_gstrings_stats[i].stat_offset; | ||
1980 | break; | ||
1981 | } | ||
1982 | |||
1966 | data[i] = (igb_gstrings_stats[i].sizeof_stat == | 1983 | data[i] = (igb_gstrings_stats[i].sizeof_stat == |
1967 | sizeof(u64)) ? *(u64 *)p : *(u32 *)p; | 1984 | sizeof(u64)) ? *(u64 *)p : *(u32 *)p; |
1968 | } | 1985 | } |