Skip to content

Commit

Permalink
igb: Fix erroneous display of stats by ethtool -S
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ajit Khaparde authored and David S. Miller committed Oct 13, 2009
1 parent 8328c38 commit 231835e
Showing 1 changed file with 22 additions and 5 deletions.
27 changes: 22 additions & 5 deletions drivers/net/igb/igb_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,22 @@

#include "igb.h"

enum {NETDEV_STATS, IGB_STATS};

struct igb_stats {
char stat_string[ETH_GSTRING_LEN];
int type;
int sizeof_stat;
int stat_offset;
};

#define IGB_STAT(m) FIELD_SIZEOF(struct igb_adapter, m), \
offsetof(struct igb_adapter, m)
#define IGB_NETDEV_STAT(m) FIELD_SIZEOF(struct net_device, m), \
offsetof(struct net_device, m)
#define IGB_STAT(m) IGB_STATS, \
FIELD_SIZEOF(struct igb_adapter, m), \
offsetof(struct igb_adapter, m)
#define IGB_NETDEV_STAT(m) NETDEV_STATS, \
FIELD_SIZEOF(struct net_device, m), \
offsetof(struct net_device, m)

static const struct igb_stats igb_gstrings_stats[] = {
{ "rx_packets", IGB_STAT(stats.gprc) },
{ "tx_packets", IGB_STAT(stats.gptc) },
Expand Down Expand Up @@ -1959,10 +1965,21 @@ static void igb_get_ethtool_stats(struct net_device *netdev,
int stat_count_rx = sizeof(struct igb_rx_queue_stats) / sizeof(u64);
int j;
int i;
char *p = NULL;

igb_update_stats(adapter);
for (i = 0; i < IGB_GLOBAL_STATS_LEN; i++) {
char *p = (char *)adapter+igb_gstrings_stats[i].stat_offset;
switch (igb_gstrings_stats[i].type) {
case NETDEV_STATS:
p = (char *) netdev +
igb_gstrings_stats[i].stat_offset;
break;
case IGB_STATS:
p = (char *) adapter +
igb_gstrings_stats[i].stat_offset;
break;
}

data[i] = (igb_gstrings_stats[i].sizeof_stat ==
sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
}
Expand Down

0 comments on commit 231835e

Please sign in to comment.