Skip to content

Commit 010cadf

Browse files
pmachatadavem330
authored andcommitted
mlxsw: spectrum_router: Support FID-less RIFs
Loopback RIFs, which will be introduced in a follow-up patch, differ from other RIFs in that they do not have a FID associated with them. To support this, demote FID allocation from mlxsw_sp_rif_create to configure op of the existing RIF types, and likewise the FID release from mlxsw_sp_rif_destroy to deconfigure op. Signed-off-by: Petr Machata <[email protected]> Reviewed-by: Ido Schimmel <[email protected]> Signed-off-by: Jiri Pirko <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 38ebc0f commit 010cadf

File tree

1 file changed

+63
-22
lines changed

1 file changed

+63
-22
lines changed

drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4444,9 +4444,9 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
44444444
{
44454445
u32 tb_id = l3mdev_fib_table(params->dev);
44464446
const struct mlxsw_sp_rif_ops *ops;
4447+
struct mlxsw_sp_fid *fid = NULL;
44474448
enum mlxsw_sp_rif_type type;
44484449
struct mlxsw_sp_rif *rif;
4449-
struct mlxsw_sp_fid *fid;
44504450
struct mlxsw_sp_vr *vr;
44514451
u16 rif_index;
44524452
int err;
@@ -4470,12 +4470,14 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
44704470
rif->mlxsw_sp = mlxsw_sp;
44714471
rif->ops = ops;
44724472

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;
44774480
}
4478-
rif->fid = fid;
44794481

44804482
if (ops->setup)
44814483
ops->setup(rif, params);
@@ -4484,22 +4486,15 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
44844486
if (err)
44854487
goto err_configure;
44864488

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-
44924489
mlxsw_sp_rif_counters_alloc(rif);
4493-
mlxsw_sp_fid_rif_set(fid, rif);
44944490
mlxsw_sp->router->rifs[rif_index] = rif;
44954491
vr->rif_count++;
44964492

44974493
return rif;
44984494

4499-
err_rif_fdb_op:
4500-
ops->deconfigure(rif);
45014495
err_configure:
4502-
mlxsw_sp_fid_put(fid);
4496+
if (fid)
4497+
mlxsw_sp_fid_put(fid);
45034498
err_fid_get:
45044499
kfree(rif);
45054500
err_rif_alloc:
@@ -4520,12 +4515,11 @@ void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif)
45204515

45214516
vr->rif_count--;
45224517
mlxsw_sp->router->rifs[rif->rif_index] = NULL;
4523-
mlxsw_sp_fid_rif_set(fid, NULL);
45244518
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);
45274519
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);
45294523
kfree(rif);
45304524
mlxsw_sp_vr_put(vr);
45314525
}
@@ -4965,11 +4959,32 @@ static int mlxsw_sp_rif_subport_op(struct mlxsw_sp_rif *rif, bool enable)
49654959

49664960
static int mlxsw_sp_rif_subport_configure(struct mlxsw_sp_rif *rif)
49674961
{
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;
49694979
}
49704980

49714981
static void mlxsw_sp_rif_subport_deconfigure(struct mlxsw_sp_rif *rif)
49724982
{
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);
49734988
mlxsw_sp_rif_subport_op(rif, false);
49744989
}
49754990

@@ -5028,8 +5043,17 @@ static int mlxsw_sp_rif_vlan_configure(struct mlxsw_sp_rif *rif)
50285043
if (err)
50295044
goto err_fid_bc_flood_set;
50305045

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);
50315052
return 0;
50325053

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);
50335057
err_fid_bc_flood_set:
50345058
mlxsw_sp_fid_flood_set(rif->fid, MLXSW_SP_FLOOD_TYPE_MC,
50355059
mlxsw_sp_router_port(mlxsw_sp), false);
@@ -5040,9 +5064,13 @@ static int mlxsw_sp_rif_vlan_configure(struct mlxsw_sp_rif *rif)
50405064

50415065
static void mlxsw_sp_rif_vlan_deconfigure(struct mlxsw_sp_rif *rif)
50425066
{
5043-
struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp;
50445067
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;
50455070

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);
50465074
mlxsw_sp_fid_flood_set(rif->fid, MLXSW_SP_FLOOD_TYPE_BC,
50475075
mlxsw_sp_router_port(mlxsw_sp), false);
50485076
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)
50875115
if (err)
50885116
goto err_fid_bc_flood_set;
50895117

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);
50905124
return 0;
50915125

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);
50925129
err_fid_bc_flood_set:
50935130
mlxsw_sp_fid_flood_set(rif->fid, MLXSW_SP_FLOOD_TYPE_MC,
50945131
mlxsw_sp_router_port(mlxsw_sp), false);
@@ -5099,9 +5136,13 @@ static int mlxsw_sp_rif_fid_configure(struct mlxsw_sp_rif *rif)
50995136

51005137
static void mlxsw_sp_rif_fid_deconfigure(struct mlxsw_sp_rif *rif)
51015138
{
5102-
struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp;
51035139
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;
51045142

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);
51055146
mlxsw_sp_fid_flood_set(rif->fid, MLXSW_SP_FLOOD_TYPE_BC,
51065147
mlxsw_sp_router_port(mlxsw_sp), false);
51075148
mlxsw_sp_fid_flood_set(rif->fid, MLXSW_SP_FLOOD_TYPE_MC,

0 commit comments

Comments
 (0)