u64 bytes = 0;
        int err = 0;
 
-       if (!vport->enabled || esw->mode != MLX5_ESWITCH_LEGACY)
+       if (esw->mode != MLX5_ESWITCH_LEGACY)
                return 0;
 
+       mutex_lock(&esw->state_lock);
+       if (!vport->enabled)
+               goto unlock;
+
        if (vport->egress.legacy.drop_counter)
                mlx5_fc_query(dev, vport->egress.legacy.drop_counter,
                              &stats->rx_dropped, &bytes);
 
        if (!MLX5_CAP_GEN(dev, receive_discard_vport_down) &&
            !MLX5_CAP_GEN(dev, transmit_discard_vport_down))
-               return 0;
+               goto unlock;
 
        err = mlx5_query_vport_down_stats(dev, vport->vport, 1,
                                          &rx_discard_vport_down,
                                          &tx_discard_vport_down);
        if (err)
-               return err;
+               goto unlock;
 
        if (MLX5_CAP_GEN(dev, receive_discard_vport_down))
                stats->rx_dropped += rx_discard_vport_down;
        if (MLX5_CAP_GEN(dev, transmit_discard_vport_down))
                stats->tx_dropped += tx_discard_vport_down;
 
-       return 0;
+unlock:
+       mutex_unlock(&esw->state_lock);
+       return err;
 }
 
 int mlx5_eswitch_get_vport_stats(struct mlx5_eswitch *esw,