@@ -4444,9 +4444,9 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
4444
4444
{
4445
4445
u32 tb_id = l3mdev_fib_table (params -> dev );
4446
4446
const struct mlxsw_sp_rif_ops * ops ;
4447
+ struct mlxsw_sp_fid * fid = NULL ;
4447
4448
enum mlxsw_sp_rif_type type ;
4448
4449
struct mlxsw_sp_rif * rif ;
4449
- struct mlxsw_sp_fid * fid ;
4450
4450
struct mlxsw_sp_vr * vr ;
4451
4451
u16 rif_index ;
4452
4452
int err ;
@@ -4470,12 +4470,14 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
4470
4470
rif -> mlxsw_sp = mlxsw_sp ;
4471
4471
rif -> ops = ops ;
4472
4472
4473
- fid = ops -> fid_get (rif );
4474
- if (IS_ERR (fid )) {
4475
- err = PTR_ERR (fid );
4476
- goto err_fid_get ;
4473
+ if (ops -> fid_get ) {
4474
+ fid = ops -> fid_get (rif );
4475
+ if (IS_ERR (fid )) {
4476
+ err = PTR_ERR (fid );
4477
+ goto err_fid_get ;
4478
+ }
4479
+ rif -> fid = fid ;
4477
4480
}
4478
- rif -> fid = fid ;
4479
4481
4480
4482
if (ops -> setup )
4481
4483
ops -> setup (rif , params );
@@ -4484,22 +4486,15 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
4484
4486
if (err )
4485
4487
goto err_configure ;
4486
4488
4487
- err = mlxsw_sp_rif_fdb_op (mlxsw_sp , params -> dev -> dev_addr ,
4488
- mlxsw_sp_fid_index (fid ), true);
4489
- if (err )
4490
- goto err_rif_fdb_op ;
4491
-
4492
4489
mlxsw_sp_rif_counters_alloc (rif );
4493
- mlxsw_sp_fid_rif_set (fid , rif );
4494
4490
mlxsw_sp -> router -> rifs [rif_index ] = rif ;
4495
4491
vr -> rif_count ++ ;
4496
4492
4497
4493
return rif ;
4498
4494
4499
- err_rif_fdb_op :
4500
- ops -> deconfigure (rif );
4501
4495
err_configure :
4502
- mlxsw_sp_fid_put (fid );
4496
+ if (fid )
4497
+ mlxsw_sp_fid_put (fid );
4503
4498
err_fid_get :
4504
4499
kfree (rif );
4505
4500
err_rif_alloc :
@@ -4520,12 +4515,11 @@ void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif)
4520
4515
4521
4516
vr -> rif_count -- ;
4522
4517
mlxsw_sp -> router -> rifs [rif -> rif_index ] = NULL ;
4523
- mlxsw_sp_fid_rif_set (fid , NULL );
4524
4518
mlxsw_sp_rif_counters_free (rif );
4525
- mlxsw_sp_rif_fdb_op (mlxsw_sp , rif -> dev -> dev_addr ,
4526
- mlxsw_sp_fid_index (fid ), false);
4527
4519
ops -> deconfigure (rif );
4528
- mlxsw_sp_fid_put (fid );
4520
+ if (fid )
4521
+ /* Loopback RIFs are not associated with a FID. */
4522
+ mlxsw_sp_fid_put (fid );
4529
4523
kfree (rif );
4530
4524
mlxsw_sp_vr_put (vr );
4531
4525
}
@@ -4965,11 +4959,32 @@ static int mlxsw_sp_rif_subport_op(struct mlxsw_sp_rif *rif, bool enable)
4965
4959
4966
4960
static int mlxsw_sp_rif_subport_configure (struct mlxsw_sp_rif * rif )
4967
4961
{
4968
- return mlxsw_sp_rif_subport_op (rif , true);
4962
+ int err ;
4963
+
4964
+ err = mlxsw_sp_rif_subport_op (rif , true);
4965
+ if (err )
4966
+ return err ;
4967
+
4968
+ err = mlxsw_sp_rif_fdb_op (rif -> mlxsw_sp , rif -> dev -> dev_addr ,
4969
+ mlxsw_sp_fid_index (rif -> fid ), true);
4970
+ if (err )
4971
+ goto err_rif_fdb_op ;
4972
+
4973
+ mlxsw_sp_fid_rif_set (rif -> fid , rif );
4974
+ return 0 ;
4975
+
4976
+ err_rif_fdb_op :
4977
+ mlxsw_sp_rif_subport_op (rif , false);
4978
+ return err ;
4969
4979
}
4970
4980
4971
4981
static void mlxsw_sp_rif_subport_deconfigure (struct mlxsw_sp_rif * rif )
4972
4982
{
4983
+ struct mlxsw_sp_fid * fid = rif -> fid ;
4984
+
4985
+ mlxsw_sp_fid_rif_set (fid , NULL );
4986
+ mlxsw_sp_rif_fdb_op (rif -> mlxsw_sp , rif -> dev -> dev_addr ,
4987
+ mlxsw_sp_fid_index (fid ), false);
4973
4988
mlxsw_sp_rif_subport_op (rif , false);
4974
4989
}
4975
4990
@@ -5028,8 +5043,17 @@ static int mlxsw_sp_rif_vlan_configure(struct mlxsw_sp_rif *rif)
5028
5043
if (err )
5029
5044
goto err_fid_bc_flood_set ;
5030
5045
5046
+ err = mlxsw_sp_rif_fdb_op (rif -> mlxsw_sp , rif -> dev -> dev_addr ,
5047
+ mlxsw_sp_fid_index (rif -> fid ), true);
5048
+ if (err )
5049
+ goto err_rif_fdb_op ;
5050
+
5051
+ mlxsw_sp_fid_rif_set (rif -> fid , rif );
5031
5052
return 0 ;
5032
5053
5054
+ err_rif_fdb_op :
5055
+ mlxsw_sp_fid_flood_set (rif -> fid , MLXSW_SP_FLOOD_TYPE_BC ,
5056
+ mlxsw_sp_router_port (mlxsw_sp ), false);
5033
5057
err_fid_bc_flood_set :
5034
5058
mlxsw_sp_fid_flood_set (rif -> fid , MLXSW_SP_FLOOD_TYPE_MC ,
5035
5059
mlxsw_sp_router_port (mlxsw_sp ), false);
@@ -5040,9 +5064,13 @@ static int mlxsw_sp_rif_vlan_configure(struct mlxsw_sp_rif *rif)
5040
5064
5041
5065
static void mlxsw_sp_rif_vlan_deconfigure (struct mlxsw_sp_rif * rif )
5042
5066
{
5043
- struct mlxsw_sp * mlxsw_sp = rif -> mlxsw_sp ;
5044
5067
u16 vid = mlxsw_sp_fid_8021q_vid (rif -> fid );
5068
+ struct mlxsw_sp * mlxsw_sp = rif -> mlxsw_sp ;
5069
+ struct mlxsw_sp_fid * fid = rif -> fid ;
5045
5070
5071
+ mlxsw_sp_fid_rif_set (fid , NULL );
5072
+ mlxsw_sp_rif_fdb_op (rif -> mlxsw_sp , rif -> dev -> dev_addr ,
5073
+ mlxsw_sp_fid_index (fid ), false);
5046
5074
mlxsw_sp_fid_flood_set (rif -> fid , MLXSW_SP_FLOOD_TYPE_BC ,
5047
5075
mlxsw_sp_router_port (mlxsw_sp ), false);
5048
5076
mlxsw_sp_fid_flood_set (rif -> fid , MLXSW_SP_FLOOD_TYPE_MC ,
@@ -5087,8 +5115,17 @@ static int mlxsw_sp_rif_fid_configure(struct mlxsw_sp_rif *rif)
5087
5115
if (err )
5088
5116
goto err_fid_bc_flood_set ;
5089
5117
5118
+ err = mlxsw_sp_rif_fdb_op (rif -> mlxsw_sp , rif -> dev -> dev_addr ,
5119
+ mlxsw_sp_fid_index (rif -> fid ), true);
5120
+ if (err )
5121
+ goto err_rif_fdb_op ;
5122
+
5123
+ mlxsw_sp_fid_rif_set (rif -> fid , rif );
5090
5124
return 0 ;
5091
5125
5126
+ err_rif_fdb_op :
5127
+ mlxsw_sp_fid_flood_set (rif -> fid , MLXSW_SP_FLOOD_TYPE_BC ,
5128
+ mlxsw_sp_router_port (mlxsw_sp ), false);
5092
5129
err_fid_bc_flood_set :
5093
5130
mlxsw_sp_fid_flood_set (rif -> fid , MLXSW_SP_FLOOD_TYPE_MC ,
5094
5131
mlxsw_sp_router_port (mlxsw_sp ), false);
@@ -5099,9 +5136,13 @@ static int mlxsw_sp_rif_fid_configure(struct mlxsw_sp_rif *rif)
5099
5136
5100
5137
static void mlxsw_sp_rif_fid_deconfigure (struct mlxsw_sp_rif * rif )
5101
5138
{
5102
- struct mlxsw_sp * mlxsw_sp = rif -> mlxsw_sp ;
5103
5139
u16 fid_index = mlxsw_sp_fid_index (rif -> fid );
5140
+ struct mlxsw_sp * mlxsw_sp = rif -> mlxsw_sp ;
5141
+ struct mlxsw_sp_fid * fid = rif -> fid ;
5104
5142
5143
+ mlxsw_sp_fid_rif_set (fid , NULL );
5144
+ mlxsw_sp_rif_fdb_op (rif -> mlxsw_sp , rif -> dev -> dev_addr ,
5145
+ mlxsw_sp_fid_index (fid ), false);
5105
5146
mlxsw_sp_fid_flood_set (rif -> fid , MLXSW_SP_FLOOD_TYPE_BC ,
5106
5147
mlxsw_sp_router_port (mlxsw_sp ), false);
5107
5148
mlxsw_sp_fid_flood_set (rif -> fid , MLXSW_SP_FLOOD_TYPE_MC ,
0 commit comments