void mlx5_lag_disable_change(struct mlx5_core_dev *dev)
{
+ struct mlx5_devcom_comp_dev *sd_devcom = mlx5_sd_get_devcom(dev);
+ struct mlx5_core_dev *primary = dev;
struct mlx5_lag *ldev;
+ struct lag_func *pf;
+ int i;
ldev = mlx5_lag_dev(dev);
if (!ldev)
return;
- mlx5_devcom_comp_lock(dev->priv.hca_devcom_comp);
+ if (sd_devcom) {
+ mlx5_devcom_comp_lock(sd_devcom);
+ primary = mlx5_sd_get_primary(dev) ?: dev;
+ mlx5_devcom_comp_unlock(sd_devcom);
+ }
+ mlx5_devcom_comp_lock(primary->priv.hca_devcom_comp);
mutex_lock(&ldev->lock);
ldev->mode_changes_in_progress++;
}
mutex_unlock(&ldev->lock);
- mlx5_devcom_comp_unlock(dev->priv.hca_devcom_comp);
+ mlx5_devcom_comp_unlock(primary->priv.hca_devcom_comp);
+
+ if (!sd_devcom)
+ return;
+
+ /* Teardown SD shared FDB for this device's group if active */
+ mlx5_devcom_comp_lock(sd_devcom);
+ mutex_lock(&ldev->lock);
+ mlx5_lag_for_each(i, 0, ldev, MLX5_LAG_FILTER_ALL) {
+ pf = mlx5_lag_pf(ldev, i);
+ if (pf->dev == dev && pf->sd_fdb_active) {
+ mlx5_lag_shared_fdb_destroy(ldev, pf->group_id);
+ break;
+ }
+ }
+ mutex_unlock(&ldev->lock);
+ mlx5_devcom_comp_unlock(sd_devcom);
}
void mlx5_lag_enable_change(struct mlx5_core_dev *dev)