@@ -4771,9 +4771,6 @@ static int mlxsw_sp_port_lag_join(struct mlxsw_sp_port *mlxsw_sp_port,
4771
4771
err = mlxsw_sp_lag_col_port_add (mlxsw_sp_port , lag_id , port_index );
4772
4772
if (err )
4773
4773
goto err_col_port_add ;
4774
- err = mlxsw_sp_lag_col_port_enable (mlxsw_sp_port , lag_id );
4775
- if (err )
4776
- goto err_col_port_enable ;
4777
4774
4778
4775
mlxsw_core_lag_mapping_set (mlxsw_sp -> core , lag_id , port_index ,
4779
4776
mlxsw_sp_port -> local_port );
@@ -4787,8 +4784,6 @@ static int mlxsw_sp_port_lag_join(struct mlxsw_sp_port *mlxsw_sp_port,
4787
4784
4788
4785
return 0 ;
4789
4786
4790
- err_col_port_enable :
4791
- mlxsw_sp_lag_col_port_remove (mlxsw_sp_port , lag_id );
4792
4787
err_col_port_add :
4793
4788
if (!lag -> ref_count )
4794
4789
mlxsw_sp_lag_destroy (mlxsw_sp , lag_id );
@@ -4807,7 +4802,6 @@ static void mlxsw_sp_port_lag_leave(struct mlxsw_sp_port *mlxsw_sp_port,
4807
4802
lag = mlxsw_sp_lag_get (mlxsw_sp , lag_id );
4808
4803
WARN_ON (lag -> ref_count == 0 );
4809
4804
4810
- mlxsw_sp_lag_col_port_disable (mlxsw_sp_port , lag_id );
4811
4805
mlxsw_sp_lag_col_port_remove (mlxsw_sp_port , lag_id );
4812
4806
4813
4807
/* Any VLANs configured on the port are no longer valid */
@@ -4852,21 +4846,56 @@ static int mlxsw_sp_lag_dist_port_remove(struct mlxsw_sp_port *mlxsw_sp_port,
4852
4846
return mlxsw_reg_write (mlxsw_sp -> core , MLXSW_REG (sldr ), sldr_pl );
4853
4847
}
4854
4848
4855
- static int mlxsw_sp_port_lag_tx_en_set ( struct mlxsw_sp_port * mlxsw_sp_port ,
4856
- bool lag_tx_enabled )
4849
+ static int
4850
+ mlxsw_sp_port_lag_col_dist_enable ( struct mlxsw_sp_port * mlxsw_sp_port )
4857
4851
{
4858
- if (lag_tx_enabled )
4859
- return mlxsw_sp_lag_dist_port_add (mlxsw_sp_port ,
4860
- mlxsw_sp_port -> lag_id );
4861
- else
4862
- return mlxsw_sp_lag_dist_port_remove (mlxsw_sp_port ,
4863
- mlxsw_sp_port -> lag_id );
4852
+ int err ;
4853
+
4854
+ err = mlxsw_sp_lag_col_port_enable (mlxsw_sp_port ,
4855
+ mlxsw_sp_port -> lag_id );
4856
+ if (err )
4857
+ return err ;
4858
+
4859
+ err = mlxsw_sp_lag_dist_port_add (mlxsw_sp_port , mlxsw_sp_port -> lag_id );
4860
+ if (err )
4861
+ goto err_dist_port_add ;
4862
+
4863
+ return 0 ;
4864
+
4865
+ err_dist_port_add :
4866
+ mlxsw_sp_lag_col_port_disable (mlxsw_sp_port , mlxsw_sp_port -> lag_id );
4867
+ return err ;
4868
+ }
4869
+
4870
+ static int
4871
+ mlxsw_sp_port_lag_col_dist_disable (struct mlxsw_sp_port * mlxsw_sp_port )
4872
+ {
4873
+ int err ;
4874
+
4875
+ err = mlxsw_sp_lag_dist_port_remove (mlxsw_sp_port ,
4876
+ mlxsw_sp_port -> lag_id );
4877
+ if (err )
4878
+ return err ;
4879
+
4880
+ err = mlxsw_sp_lag_col_port_disable (mlxsw_sp_port ,
4881
+ mlxsw_sp_port -> lag_id );
4882
+ if (err )
4883
+ goto err_col_port_disable ;
4884
+
4885
+ return 0 ;
4886
+
4887
+ err_col_port_disable :
4888
+ mlxsw_sp_lag_dist_port_add (mlxsw_sp_port , mlxsw_sp_port -> lag_id );
4889
+ return err ;
4864
4890
}
4865
4891
4866
4892
static int mlxsw_sp_port_lag_changed (struct mlxsw_sp_port * mlxsw_sp_port ,
4867
4893
struct netdev_lag_lower_state_info * info )
4868
4894
{
4869
- return mlxsw_sp_port_lag_tx_en_set (mlxsw_sp_port , info -> tx_enabled );
4895
+ if (info -> tx_enabled )
4896
+ return mlxsw_sp_port_lag_col_dist_enable (mlxsw_sp_port );
4897
+ else
4898
+ return mlxsw_sp_port_lag_col_dist_disable (mlxsw_sp_port );
4870
4899
}
4871
4900
4872
4901
static int mlxsw_sp_port_stp_set (struct mlxsw_sp_port * mlxsw_sp_port ,
@@ -5089,8 +5118,7 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev,
5089
5118
err = mlxsw_sp_port_lag_join (mlxsw_sp_port ,
5090
5119
upper_dev );
5091
5120
} else {
5092
- mlxsw_sp_port_lag_tx_en_set (mlxsw_sp_port ,
5093
- false);
5121
+ mlxsw_sp_port_lag_col_dist_disable (mlxsw_sp_port );
5094
5122
mlxsw_sp_port_lag_leave (mlxsw_sp_port ,
5095
5123
upper_dev );
5096
5124
}
0 commit comments