Skip to content

Commit ce95e15

Browse files
idoschdavem330
authored andcommitted
mlxsw: spectrum: Change signature of FID leave function
When a vPort is destroyed, it leaves the FID it's currently mapped to (if any) and drops the reference. The FID's leave function expects to get the vPort as its argument, but this will have to change when the vPort model is retired. Change the function signature to expect a Port-VLAN struct instead and patch the call sites accordingly. The code introduced in this patch will be removed later in the patchset, but this intermediary step is required in order to ease the code review. Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 31a08a5 commit ce95e15

File tree

3 files changed

+47
-21
lines changed

3 files changed

+47
-21
lines changed

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

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,7 +1574,7 @@ static int mlxsw_sp_port_kill_vid(struct net_device *dev,
15741574
*/
15751575
f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
15761576
if (f && !WARN_ON(!f->leave))
1577-
f->leave(mlxsw_sp_vport);
1577+
f->leave(mlxsw_sp_port_vlan);
15781578

15791579
mlxsw_sp_port_vport_destroy(mlxsw_sp_vport);
15801580

@@ -4192,19 +4192,21 @@ static void
41924192
mlxsw_sp_port_pvid_vport_lag_join(struct mlxsw_sp_port *mlxsw_sp_port,
41934193
struct net_device *lag_dev, u16 lag_id)
41944194
{
4195+
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
41954196
struct mlxsw_sp_port *mlxsw_sp_vport;
41964197
struct mlxsw_sp_fid *f;
41974198

41984199
mlxsw_sp_vport = mlxsw_sp_port_vport_find(mlxsw_sp_port, 1);
41994200
if (WARN_ON(!mlxsw_sp_vport))
42004201
return;
42014202

4203+
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, 1);
42024204
/* If vPort is assigned a RIF, then leave it since it's no
42034205
* longer valid.
42044206
*/
42054207
f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
42064208
if (f)
4207-
f->leave(mlxsw_sp_vport);
4209+
f->leave(mlxsw_sp_port_vlan);
42084210

42094211
mlxsw_sp_vport->lag_id = lag_id;
42104212
mlxsw_sp_vport->lagged = 1;
@@ -4214,16 +4216,18 @@ mlxsw_sp_port_pvid_vport_lag_join(struct mlxsw_sp_port *mlxsw_sp_port,
42144216
static void
42154217
mlxsw_sp_port_pvid_vport_lag_leave(struct mlxsw_sp_port *mlxsw_sp_port)
42164218
{
4219+
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
42174220
struct mlxsw_sp_port *mlxsw_sp_vport;
42184221
struct mlxsw_sp_fid *f;
42194222

42204223
mlxsw_sp_vport = mlxsw_sp_port_vport_find(mlxsw_sp_port, 1);
42214224
if (WARN_ON(!mlxsw_sp_vport))
42224225
return;
42234226

4227+
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, 1);
42244228
f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
42254229
if (f)
4226-
f->leave(mlxsw_sp_vport);
4230+
f->leave(mlxsw_sp_port_vlan);
42274231

42284232
mlxsw_sp_vport->dev = mlxsw_sp_port->dev;
42294233
mlxsw_sp_vport->lagged = 0;
@@ -4652,7 +4656,8 @@ static int mlxsw_sp_vfid_op(struct mlxsw_sp *mlxsw_sp, u16 fid, bool create)
46524656
return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfmr), sfmr_pl);
46534657
}
46544658

4655-
static void mlxsw_sp_vport_vfid_leave(struct mlxsw_sp_port *mlxsw_sp_vport);
4659+
static void
4660+
mlxsw_sp_port_vlan_vfid_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
46564661

46574662
static struct mlxsw_sp_fid *mlxsw_sp_vfid_create(struct mlxsw_sp *mlxsw_sp,
46584663
struct net_device *br_dev)
@@ -4679,7 +4684,7 @@ static struct mlxsw_sp_fid *mlxsw_sp_vfid_create(struct mlxsw_sp *mlxsw_sp,
46794684
if (!f)
46804685
goto err_allocate_vfid;
46814686

4682-
f->leave = mlxsw_sp_vport_vfid_leave;
4687+
f->leave = mlxsw_sp_port_vlan_vfid_leave;
46834688
f->fid = fid;
46844689
f->dev = br_dev;
46854690

@@ -4767,17 +4772,22 @@ static int mlxsw_sp_vport_vfid_join(struct mlxsw_sp_port *mlxsw_sp_vport,
47674772
return err;
47684773
}
47694774

4770-
static void mlxsw_sp_vport_vfid_leave(struct mlxsw_sp_port *mlxsw_sp_vport)
4775+
static void
4776+
mlxsw_sp_port_vlan_vfid_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
47714777
{
4772-
struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
4773-
struct mlxsw_sp_port *mlxsw_sp_port;
4778+
struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
4779+
struct mlxsw_sp_port *mlxsw_sp_vport;
4780+
u16 vid = mlxsw_sp_port_vlan->vid;
4781+
struct mlxsw_sp_fid *f;
4782+
4783+
mlxsw_sp_vport = mlxsw_sp_port_vport_find(mlxsw_sp_port, vid);
4784+
f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
47744785

47754786
netdev_dbg(mlxsw_sp_vport->dev, "Left FID=%d\n", f->fid);
47764787

47774788
mlxsw_sp_vport_fid_set(mlxsw_sp_vport, NULL);
47784789
f->ref_count--;
47794790

4780-
mlxsw_sp_port = mlxsw_sp_vport_port(mlxsw_sp_vport);
47814791
if (mlxsw_sp_port->nr_port_vid_map == 1)
47824792
mlxsw_sp_port_vlan_mode_trans(mlxsw_sp_port);
47834793
mlxsw_sp_port->nr_port_vid_map--;
@@ -4797,11 +4807,15 @@ static int mlxsw_sp_vport_bridge_join(struct mlxsw_sp_port *mlxsw_sp_vport,
47974807
{
47984808
struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
47994809
u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport);
4810+
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
48004811
struct net_device *dev = mlxsw_sp_vport->dev;
4812+
struct mlxsw_sp_port *mlxsw_sp_port;
48014813
int err;
48024814

4815+
mlxsw_sp_port = mlxsw_sp_vport_port(mlxsw_sp_vport);
4816+
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
48034817
if (f && !WARN_ON(!f->leave))
4804-
f->leave(mlxsw_sp_vport);
4818+
f->leave(mlxsw_sp_port_vlan);
48054819

48064820
err = mlxsw_sp_vport_vfid_join(mlxsw_sp_vport, br_dev);
48074821
if (err) {
@@ -4826,17 +4840,21 @@ static int mlxsw_sp_vport_bridge_join(struct mlxsw_sp_port *mlxsw_sp_vport,
48264840
return 0;
48274841

48284842
err_port_vid_learning_set:
4829-
mlxsw_sp_vport_vfid_leave(mlxsw_sp_vport);
4843+
mlxsw_sp_port_vlan_vfid_leave(mlxsw_sp_port_vlan);
48304844
return err;
48314845
}
48324846

48334847
static void mlxsw_sp_vport_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_vport)
48344848
{
48354849
u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport);
4850+
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
4851+
struct mlxsw_sp_port *mlxsw_sp_port;
48364852

48374853
mlxsw_sp_port_vid_learning_set(mlxsw_sp_vport, vid, false);
48384854

4839-
mlxsw_sp_vport_vfid_leave(mlxsw_sp_vport);
4855+
mlxsw_sp_port = mlxsw_sp_vport_port(mlxsw_sp_vport);
4856+
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
4857+
mlxsw_sp_port_vlan_vfid_leave(mlxsw_sp_port_vlan);
48404858

48414859
mlxsw_sp_vport->learning = 0;
48424860
mlxsw_sp_vport->learning_sync = 0;

drivers/net/ethernet/mellanox/mlxsw/spectrum.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
#define MLXSW_SP_KVD_LINEAR_SIZE 65536 /* entries */
7171
#define MLXSW_SP_KVD_GRANULARITY 128
7272

73+
struct mlxsw_sp_port_vlan;
7374
struct mlxsw_sp_port;
7475
struct mlxsw_sp_rif;
7576

@@ -79,7 +80,7 @@ struct mlxsw_sp_upper {
7980
};
8081

8182
struct mlxsw_sp_fid {
82-
void (*leave)(struct mlxsw_sp_port *mlxsw_sp_vport);
83+
void (*leave)(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
8384
struct list_head list;
8485
unsigned int ref_count;
8586
struct net_device *dev;

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

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2945,7 +2945,8 @@ static int mlxsw_sp_vport_rif_sp_op(struct mlxsw_sp_port *mlxsw_sp_vport,
29452945
return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl);
29462946
}
29472947

2948-
static void mlxsw_sp_vport_rif_sp_leave(struct mlxsw_sp_port *mlxsw_sp_vport);
2948+
static void
2949+
mlxsw_sp_port_vlan_rif_sp_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
29492950

29502951
static u16 mlxsw_sp_rif_sp_to_fid(u16 rif_index)
29512952
{
@@ -2961,7 +2962,7 @@ mlxsw_sp_rfid_alloc(u16 fid, struct net_device *l3_dev)
29612962
if (!f)
29622963
return NULL;
29632964

2964-
f->leave = mlxsw_sp_vport_rif_sp_leave;
2965+
f->leave = mlxsw_sp_port_vlan_rif_sp_leave;
29652966
f->ref_count = 0;
29662967
f->dev = l3_dev;
29672968
f->fid = fid;
@@ -3156,18 +3157,22 @@ static int mlxsw_sp_vport_rif_sp_join(struct mlxsw_sp_port *mlxsw_sp_vport,
31563157
return err;
31573158
}
31583159

3159-
static void mlxsw_sp_vport_rif_sp_leave(struct mlxsw_sp_port *mlxsw_sp_vport)
3160+
static void
3161+
mlxsw_sp_port_vlan_rif_sp_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
31603162
{
3161-
struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
3162-
u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport);
3163-
struct mlxsw_sp_port *mlxsw_sp_port;
3163+
struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
3164+
struct mlxsw_sp_port *mlxsw_sp_vport;
3165+
u16 vid = mlxsw_sp_port_vlan->vid;
3166+
struct mlxsw_sp_fid *f;
3167+
3168+
mlxsw_sp_vport = mlxsw_sp_port_vport_find(mlxsw_sp_port, vid);
3169+
f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
31643170

31653171
netdev_dbg(mlxsw_sp_vport->dev, "Left FID=%d\n", f->fid);
31663172

31673173
f->ref_count--;
31683174
mlxsw_sp_vport_fid_set(mlxsw_sp_vport, NULL);
31693175

3170-
mlxsw_sp_port = mlxsw_sp_vport_port(mlxsw_sp_vport);
31713176
if (mlxsw_sp_port->nr_port_vid_map == 1)
31723177
mlxsw_sp_port_vlan_mode_trans(mlxsw_sp_port);
31733178
mlxsw_sp_port->nr_port_vid_map--;
@@ -3183,17 +3188,19 @@ static int mlxsw_sp_inetaddr_vport_event(struct net_device *l3_dev,
31833188
unsigned long event, u16 vid)
31843189
{
31853190
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(port_dev);
3191+
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
31863192
struct mlxsw_sp_port *mlxsw_sp_vport;
31873193

31883194
mlxsw_sp_vport = mlxsw_sp_port_vport_find(mlxsw_sp_port, vid);
31893195
if (WARN_ON(!mlxsw_sp_vport))
31903196
return -EINVAL;
3197+
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
31913198

31923199
switch (event) {
31933200
case NETDEV_UP:
31943201
return mlxsw_sp_vport_rif_sp_join(mlxsw_sp_vport, l3_dev);
31953202
case NETDEV_DOWN:
3196-
mlxsw_sp_vport_rif_sp_leave(mlxsw_sp_vport);
3203+
mlxsw_sp_port_vlan_rif_sp_leave(mlxsw_sp_port_vlan);
31973204
break;
31983205
}
31993206

0 commit comments

Comments
 (0)