struct efx_mac_stats *mac_stats = &efx->mac_stats;
 
        spin_lock_bh(&efx->stats_lock);
+
        efx->type->update_stats(efx);
-       spin_unlock_bh(&efx->stats_lock);
 
        stats->rx_packets = mac_stats->rx_packets;
        stats->tx_packets = mac_stats->tx_packets;
        stats->tx_errors = (stats->tx_window_errors +
                            mac_stats->tx_bad);
 
+       spin_unlock_bh(&efx->stats_lock);
+
        return stats;
 }
 
 
        const struct efx_ethtool_stat *stat;
        struct efx_channel *channel;
        struct efx_tx_queue *tx_queue;
-       struct rtnl_link_stats64 temp;
        int i;
 
        EFX_BUG_ON_PARANOID(stats->n_stats != EFX_ETHTOOL_NUM_STATS);
 
+       spin_lock_bh(&efx->stats_lock);
+
        /* Update MAC and NIC statistics */
-       dev_get_stats(net_dev, &temp);
+       efx->type->update_stats(efx);
 
        /* Fill detailed statistics buffer */
        for (i = 0; i < EFX_ETHTOOL_NUM_STATS; i++) {
                        break;
                }
        }
+
+       spin_unlock_bh(&efx->stats_lock);
 }
 
 static void efx_ethtool_self_test(struct net_device *net_dev,
 
  *     can provide.  Generic code converts these into a standard
  *     &struct net_device_stats.
  * @stats_lock: Statistics update lock. Serialises statistics fetches
+ *     and access to @mac_stats.
  *
  * This is stored in the private area of the &struct net_device.
  */