|
@@ -1166,10 +1166,60 @@ static void alx_poll_controller(struct net_device *netdev)
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+static struct rtnl_link_stats64 *alx_get_stats64(struct net_device *dev,
|
|
|
|
+ struct rtnl_link_stats64 *net_stats)
|
|
|
|
+{
|
|
|
|
+ struct alx_priv *alx = netdev_priv(dev);
|
|
|
|
+ struct alx_hw_stats *hw_stats = &alx->hw.stats;
|
|
|
|
+
|
|
|
|
+ spin_lock(&alx->stats_lock);
|
|
|
|
+
|
|
|
|
+ alx_update_hw_stats(&alx->hw);
|
|
|
|
+
|
|
|
|
+ net_stats->tx_bytes = hw_stats->tx_byte_cnt;
|
|
|
|
+ net_stats->rx_bytes = hw_stats->rx_byte_cnt;
|
|
|
|
+ net_stats->multicast = hw_stats->rx_mcast;
|
|
|
|
+ net_stats->collisions = hw_stats->tx_single_col +
|
|
|
|
+ hw_stats->tx_multi_col +
|
|
|
|
+ hw_stats->tx_late_col +
|
|
|
|
+ hw_stats->tx_abort_col;
|
|
|
|
+
|
|
|
|
+ net_stats->rx_errors = hw_stats->rx_frag +
|
|
|
|
+ hw_stats->rx_fcs_err +
|
|
|
|
+ hw_stats->rx_len_err +
|
|
|
|
+ hw_stats->rx_ov_sz +
|
|
|
|
+ hw_stats->rx_ov_rrd +
|
|
|
|
+ hw_stats->rx_align_err +
|
|
|
|
+ hw_stats->rx_ov_rxf;
|
|
|
|
+
|
|
|
|
+ net_stats->rx_fifo_errors = hw_stats->rx_ov_rxf;
|
|
|
|
+ net_stats->rx_length_errors = hw_stats->rx_len_err;
|
|
|
|
+ net_stats->rx_crc_errors = hw_stats->rx_fcs_err;
|
|
|
|
+ net_stats->rx_frame_errors = hw_stats->rx_align_err;
|
|
|
|
+ net_stats->rx_dropped = hw_stats->rx_ov_rrd;
|
|
|
|
+
|
|
|
|
+ net_stats->tx_errors = hw_stats->tx_late_col +
|
|
|
|
+ hw_stats->tx_abort_col +
|
|
|
|
+ hw_stats->tx_underrun +
|
|
|
|
+ hw_stats->tx_trunc;
|
|
|
|
+
|
|
|
|
+ net_stats->tx_aborted_errors = hw_stats->tx_abort_col;
|
|
|
|
+ net_stats->tx_fifo_errors = hw_stats->tx_underrun;
|
|
|
|
+ net_stats->tx_window_errors = hw_stats->tx_late_col;
|
|
|
|
+
|
|
|
|
+ net_stats->tx_packets = hw_stats->tx_ok + net_stats->tx_errors;
|
|
|
|
+ net_stats->rx_packets = hw_stats->rx_ok + net_stats->rx_errors;
|
|
|
|
+
|
|
|
|
+ spin_unlock(&alx->stats_lock);
|
|
|
|
+
|
|
|
|
+ return net_stats;
|
|
|
|
+}
|
|
|
|
+
|
|
static const struct net_device_ops alx_netdev_ops = {
|
|
static const struct net_device_ops alx_netdev_ops = {
|
|
.ndo_open = alx_open,
|
|
.ndo_open = alx_open,
|
|
.ndo_stop = alx_stop,
|
|
.ndo_stop = alx_stop,
|
|
.ndo_start_xmit = alx_start_xmit,
|
|
.ndo_start_xmit = alx_start_xmit,
|
|
|
|
+ .ndo_get_stats64 = alx_get_stats64,
|
|
.ndo_set_rx_mode = alx_set_rx_mode,
|
|
.ndo_set_rx_mode = alx_set_rx_mode,
|
|
.ndo_validate_addr = eth_validate_addr,
|
|
.ndo_validate_addr = eth_validate_addr,
|
|
.ndo_set_mac_address = alx_set_mac_address,
|
|
.ndo_set_mac_address = alx_set_mac_address,
|