aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/tg3.c
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2010-07-07 16:44:24 -0400
committerDavid S. Miller <davem@davemloft.net>2010-07-09 02:12:28 -0400
commit511d22247be767bbf275ee7a5a388c4f009aa0c1 (patch)
tree80455cfcf51782be3546212e1df38b3314c86758 /drivers/net/tg3.c
parent5d07bf264746b7c22d7104e0e2232eeea3d32296 (diff)
tg3: 64 bit stats on all arches
Now core network is able to handle 64 bit netdevice stats on 32 bit arches, we can provide them for tg3, since hardware maintains 64 bit counters. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r--drivers/net/tg3.c35
1 files changed, 12 insertions, 23 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 289cdc5fde9..7c75f1e3399 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -9021,7 +9021,8 @@ err_out1:
9021 return err; 9021 return err;
9022} 9022}
9023 9023
9024static struct net_device_stats *tg3_get_stats(struct net_device *); 9024static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *,
9025 struct rtnl_link_stats64 *);
9025static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *); 9026static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *);
9026 9027
9027static int tg3_close(struct net_device *dev) 9028static int tg3_close(struct net_device *dev)
@@ -9055,8 +9056,8 @@ static int tg3_close(struct net_device *dev)
9055 9056
9056 tg3_ints_fini(tp); 9057 tg3_ints_fini(tp);
9057 9058
9058 memcpy(&tp->net_stats_prev, tg3_get_stats(tp->dev), 9059 tg3_get_stats64(tp->dev, &tp->net_stats_prev);
9059 sizeof(tp->net_stats_prev)); 9060
9060 memcpy(&tp->estats_prev, tg3_get_estats(tp), 9061 memcpy(&tp->estats_prev, tg3_get_estats(tp),
9061 sizeof(tp->estats_prev)); 9062 sizeof(tp->estats_prev));
9062 9063
@@ -9069,24 +9070,12 @@ static int tg3_close(struct net_device *dev)
9069 return 0; 9070 return 0;
9070} 9071}
9071 9072
9072static inline unsigned long get_stat64(tg3_stat64_t *val) 9073static inline u64 get_stat64(tg3_stat64_t *val)
9073{
9074 unsigned long ret;
9075
9076#if (BITS_PER_LONG == 32)
9077 ret = val->low;
9078#else
9079 ret = ((u64)val->high << 32) | ((u64)val->low);
9080#endif
9081 return ret;
9082}
9083
9084static inline u64 get_estat64(tg3_stat64_t *val)
9085{ 9074{
9086 return ((u64)val->high << 32) | ((u64)val->low); 9075 return ((u64)val->high << 32) | ((u64)val->low);
9087} 9076}
9088 9077
9089static unsigned long calc_crc_errors(struct tg3 *tp) 9078static u64 calc_crc_errors(struct tg3 *tp)
9090{ 9079{
9091 struct tg3_hw_stats *hw_stats = tp->hw_stats; 9080 struct tg3_hw_stats *hw_stats = tp->hw_stats;
9092 9081
@@ -9114,7 +9103,7 @@ static unsigned long calc_crc_errors(struct tg3 *tp)
9114 9103
9115#define ESTAT_ADD(member) \ 9104#define ESTAT_ADD(member) \
9116 estats->member = old_estats->member + \ 9105 estats->member = old_estats->member + \
9117 get_estat64(&hw_stats->member) 9106 get_stat64(&hw_stats->member)
9118 9107
9119static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp) 9108static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp)
9120{ 9109{
@@ -9204,11 +9193,11 @@ static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp)
9204 return estats; 9193 return estats;
9205} 9194}
9206 9195
9207static struct net_device_stats *tg3_get_stats(struct net_device *dev) 9196static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
9197 struct rtnl_link_stats64 *stats)
9208{ 9198{
9209 struct tg3 *tp = netdev_priv(dev); 9199 struct tg3 *tp = netdev_priv(dev);
9210 struct net_device_stats *stats = &tp->net_stats; 9200 struct rtnl_link_stats64 *old_stats = &tp->net_stats_prev;
9211 struct net_device_stats *old_stats = &tp->net_stats_prev;
9212 struct tg3_hw_stats *hw_stats = tp->hw_stats; 9201 struct tg3_hw_stats *hw_stats = tp->hw_stats;
9213 9202
9214 if (!hw_stats) 9203 if (!hw_stats)
@@ -14317,7 +14306,7 @@ static const struct net_device_ops tg3_netdev_ops = {
14317 .ndo_open = tg3_open, 14306 .ndo_open = tg3_open,
14318 .ndo_stop = tg3_close, 14307 .ndo_stop = tg3_close,
14319 .ndo_start_xmit = tg3_start_xmit, 14308 .ndo_start_xmit = tg3_start_xmit,
14320 .ndo_get_stats = tg3_get_stats, 14309 .ndo_get_stats64 = tg3_get_stats64,
14321 .ndo_validate_addr = eth_validate_addr, 14310 .ndo_validate_addr = eth_validate_addr,
14322 .ndo_set_multicast_list = tg3_set_rx_mode, 14311 .ndo_set_multicast_list = tg3_set_rx_mode,
14323 .ndo_set_mac_address = tg3_set_mac_addr, 14312 .ndo_set_mac_address = tg3_set_mac_addr,
@@ -14336,7 +14325,7 @@ static const struct net_device_ops tg3_netdev_ops_dma_bug = {
14336 .ndo_open = tg3_open, 14325 .ndo_open = tg3_open,
14337 .ndo_stop = tg3_close, 14326 .ndo_stop = tg3_close,
14338 .ndo_start_xmit = tg3_start_xmit_dma_bug, 14327 .ndo_start_xmit = tg3_start_xmit_dma_bug,
14339 .ndo_get_stats = tg3_get_stats, 14328 .ndo_get_stats64 = tg3_get_stats64,
14340 .ndo_validate_addr = eth_validate_addr, 14329 .ndo_validate_addr = eth_validate_addr,
14341 .ndo_set_multicast_list = tg3_set_rx_mode, 14330 .ndo_set_multicast_list = tg3_set_rx_mode,
14342 .ndo_set_mac_address = tg3_set_mac_addr, 14331 .ndo_set_mac_address = tg3_set_mac_addr,