|
@@ -8001,10 +8001,8 @@ static int tg3_chip_reset(struct tg3 *tp)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *,
|
|
|
- struct rtnl_link_stats64 *);
|
|
|
-static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *,
|
|
|
- struct tg3_ethtool_stats *);
|
|
|
+static void tg3_get_nstats(struct tg3 *, struct rtnl_link_stats64 *);
|
|
|
+static void tg3_get_estats(struct tg3 *, struct tg3_ethtool_stats *);
|
|
|
|
|
|
/* tp->lock is held. */
|
|
|
static int tg3_halt(struct tg3 *tp, int kind, int silent)
|
|
@@ -8025,7 +8023,7 @@ static int tg3_halt(struct tg3 *tp, int kind, int silent)
|
|
|
|
|
|
if (tp->hw_stats) {
|
|
|
/* Save the stats across chip resets... */
|
|
|
- tg3_get_stats64(tp->dev, &tp->net_stats_prev),
|
|
|
+ tg3_get_nstats(tp, &tp->net_stats_prev);
|
|
|
tg3_get_estats(tp, &tp->estats_prev);
|
|
|
|
|
|
/* And make sure the next sample is new data */
|
|
@@ -10125,7 +10123,7 @@ static inline u64 get_stat64(tg3_stat64_t *val)
|
|
|
return ((u64)val->high << 32) | ((u64)val->low);
|
|
|
}
|
|
|
|
|
|
-static u64 calc_crc_errors(struct tg3 *tp)
|
|
|
+static u64 tg3_calc_crc_errors(struct tg3 *tp)
|
|
|
{
|
|
|
struct tg3_hw_stats *hw_stats = tp->hw_stats;
|
|
|
|
|
@@ -10134,14 +10132,12 @@ static u64 calc_crc_errors(struct tg3 *tp)
|
|
|
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
|
|
|
u32 val;
|
|
|
|
|
|
- spin_lock_bh(&tp->lock);
|
|
|
if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) {
|
|
|
tg3_writephy(tp, MII_TG3_TEST1,
|
|
|
val | MII_TG3_TEST1_CRC_EN);
|
|
|
tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &val);
|
|
|
} else
|
|
|
val = 0;
|
|
|
- spin_unlock_bh(&tp->lock);
|
|
|
|
|
|
tp->phy_crc_errors += val;
|
|
|
|
|
@@ -10155,8 +10151,7 @@ static u64 calc_crc_errors(struct tg3 *tp)
|
|
|
estats->member = old_estats->member + \
|
|
|
get_stat64(&hw_stats->member)
|
|
|
|
|
|
-static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp,
|
|
|
- struct tg3_ethtool_stats *estats)
|
|
|
+static void tg3_get_estats(struct tg3 *tp, struct tg3_ethtool_stats *estats)
|
|
|
{
|
|
|
struct tg3_ethtool_stats *old_estats = &tp->estats_prev;
|
|
|
struct tg3_hw_stats *hw_stats = tp->hw_stats;
|
|
@@ -10238,20 +10233,13 @@ static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp,
|
|
|
ESTAT_ADD(nic_tx_threshold_hit);
|
|
|
|
|
|
ESTAT_ADD(mbuf_lwm_thresh_hit);
|
|
|
-
|
|
|
- return estats;
|
|
|
}
|
|
|
|
|
|
-static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
|
|
|
- struct rtnl_link_stats64 *stats)
|
|
|
+static void tg3_get_nstats(struct tg3 *tp, struct rtnl_link_stats64 *stats)
|
|
|
{
|
|
|
- struct tg3 *tp = netdev_priv(dev);
|
|
|
struct rtnl_link_stats64 *old_stats = &tp->net_stats_prev;
|
|
|
struct tg3_hw_stats *hw_stats = tp->hw_stats;
|
|
|
|
|
|
- if (!hw_stats)
|
|
|
- return old_stats;
|
|
|
-
|
|
|
stats->rx_packets = old_stats->rx_packets +
|
|
|
get_stat64(&hw_stats->rx_ucast_packets) +
|
|
|
get_stat64(&hw_stats->rx_mcast_packets) +
|
|
@@ -10294,15 +10282,13 @@ static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
|
|
|
get_stat64(&hw_stats->tx_carrier_sense_errors);
|
|
|
|
|
|
stats->rx_crc_errors = old_stats->rx_crc_errors +
|
|
|
- calc_crc_errors(tp);
|
|
|
+ tg3_calc_crc_errors(tp);
|
|
|
|
|
|
stats->rx_missed_errors = old_stats->rx_missed_errors +
|
|
|
get_stat64(&hw_stats->rx_discards);
|
|
|
|
|
|
stats->rx_dropped = tp->rx_dropped;
|
|
|
stats->tx_dropped = tp->tx_dropped;
|
|
|
-
|
|
|
- return stats;
|
|
|
}
|
|
|
|
|
|
static int tg3_get_regs_len(struct net_device *dev)
|
|
@@ -12213,6 +12199,21 @@ static const struct ethtool_ops tg3_ethtool_ops = {
|
|
|
.set_rxfh_indir = tg3_set_rxfh_indir,
|
|
|
};
|
|
|
|
|
|
+static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
|
|
|
+ struct rtnl_link_stats64 *stats)
|
|
|
+{
|
|
|
+ struct tg3 *tp = netdev_priv(dev);
|
|
|
+
|
|
|
+ if (!tp->hw_stats)
|
|
|
+ return &tp->net_stats_prev;
|
|
|
+
|
|
|
+ spin_lock_bh(&tp->lock);
|
|
|
+ tg3_get_nstats(tp, stats);
|
|
|
+ spin_unlock_bh(&tp->lock);
|
|
|
+
|
|
|
+ return stats;
|
|
|
+}
|
|
|
+
|
|
|
static void tg3_set_rx_mode(struct net_device *dev)
|
|
|
{
|
|
|
struct tg3 *tp = netdev_priv(dev);
|