@ -35,16 +35,22 @@
# include "e1000.h"
enum { NETDEV_STATS , E1000_STATS } ;
struct e1000_stats {
char stat_string [ ETH_GSTRING_LEN ] ;
int type ;
int sizeof_stat ;
int stat_offset ;
} ;
# define E1000_STAT(m) sizeof(((struct e1000_adapter *)0)->m), \
offsetof ( struct e1000_adapter , m )
# define E1000_NETDEV_STAT(m) sizeof(((struct net_device *)0)->m), \
offsetof ( struct net_device , m )
# define E1000_STAT(m) E1000_STATS, \
sizeof ( ( ( struct e1000_adapter * ) 0 ) - > m ) , \
offsetof ( struct e1000_adapter , m )
# define E1000_NETDEV_STAT(m) NETDEV_STATS, \
sizeof ( ( ( struct net_device * ) 0 ) - > m ) , \
offsetof ( struct net_device , m )
static const struct e1000_stats e1000_gstrings_stats [ ] = {
{ " rx_packets " , E1000_STAT ( stats . gprc ) } ,
{ " tx_packets " , E1000_STAT ( stats . gptc ) } ,
@ -1906,10 +1912,21 @@ static void e1000_get_ethtool_stats(struct net_device *netdev,
{
struct e1000_adapter * adapter = netdev_priv ( netdev ) ;
int i ;
char * p = NULL ;
e1000e_update_stats ( adapter ) ;
for ( i = 0 ; i < E1000_GLOBAL_STATS_LEN ; i + + ) {
char * p = ( char * ) adapter + e1000_gstrings_stats [ i ] . stat_offset ;
switch ( e1000_gstrings_stats [ i ] . type ) {
case NETDEV_STATS :
p = ( char * ) netdev +
e1000_gstrings_stats [ i ] . stat_offset ;
break ;
case E1000_STATS :
p = ( char * ) adapter +
e1000_gstrings_stats [ i ] . stat_offset ;
break ;
}
data [ i ] = ( e1000_gstrings_stats [ i ] . sizeof_stat = =
sizeof ( u64 ) ) ? * ( u64 * ) p : * ( u32 * ) p ;
}