- int i;
-
- if (!(vport->ops->flags & VPORT_F_GEN_STATS))
- return vport_call_get_stats(vport, stats);
-
- /* We potentially have 3 sources of stats that need to be
- * combined: those we have collected (split into err_stats and
- * percpu_stats), offset_stats from set_stats(), and device
- * error stats from get_stats() (for errors that happen
- * downstream and therefore aren't reported through our
- * vport_record_error() function). */
-
- spin_lock_bh(&vport->stats_lock);
-
- *stats = vport->offset_stats;
-
- stats->rx_errors += vport->err_stats.rx_errors;
- stats->tx_errors += vport->err_stats.tx_errors;
- stats->tx_dropped += vport->err_stats.tx_dropped;
- stats->rx_dropped += vport->err_stats.rx_dropped;
-
- spin_unlock_bh(&vport->stats_lock);
-
- if (vport->ops->get_stats) {
- struct rtnl_link_stats64 dev_stats;
- int err;
-
- err = vport_call_get_stats(vport, &dev_stats);
- if (err)
- return err;
-
- stats->rx_errors += dev_stats.rx_errors;
- stats->tx_errors += dev_stats.tx_errors;
- stats->rx_dropped += dev_stats.rx_dropped;
- stats->tx_dropped += dev_stats.tx_dropped;
- stats->multicast += dev_stats.multicast;
- stats->collisions += dev_stats.collisions;
- stats->rx_length_errors += dev_stats.rx_length_errors;
- stats->rx_over_errors += dev_stats.rx_over_errors;
- stats->rx_crc_errors += dev_stats.rx_crc_errors;
- stats->rx_frame_errors += dev_stats.rx_frame_errors;
- stats->rx_fifo_errors += dev_stats.rx_fifo_errors;
- stats->rx_missed_errors += dev_stats.rx_missed_errors;
- stats->tx_aborted_errors += dev_stats.tx_aborted_errors;
- stats->tx_carrier_errors += dev_stats.tx_carrier_errors;
- stats->tx_fifo_errors += dev_stats.tx_fifo_errors;
- stats->tx_heartbeat_errors += dev_stats.tx_heartbeat_errors;
- stats->tx_window_errors += dev_stats.tx_window_errors;
- stats->rx_compressed += dev_stats.rx_compressed;
- stats->tx_compressed += dev_stats.tx_compressed;
- }