Skip to content

Commit 7cbecf2

Browse files
idoschdavem330
authored andcommitted
mlxsw: spectrum_router: Replace vPorts with Port-VLAN
We're going to get rid of vPorts completely later in the patchset, but the router code is self-contained, so it's a good candidate to start the transition with. Convert all the functions that expects to operate on a vPort to operate on a Port-VLAN instead. 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 ce95e15 commit 7cbecf2

File tree

2 files changed

+67
-74
lines changed

2 files changed

+67
-74
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,6 +1499,10 @@ mlxsw_sp_port_vlan_create(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid)
14991499
static void
15001500
mlxsw_sp_port_vlan_destroy(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
15011501
{
1502+
struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
1503+
1504+
if (fid && !WARN_ON(!fid->leave))
1505+
fid->leave(mlxsw_sp_port_vlan);
15021506
list_del(&mlxsw_sp_port_vlan->list);
15031507
kfree(mlxsw_sp_port_vlan);
15041508
}

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

Lines changed: 63 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -2917,30 +2917,23 @@ static int mlxsw_sp_avail_rif_get(struct mlxsw_sp *mlxsw_sp)
29172917
return MLXSW_SP_INVALID_INDEX_RIF;
29182918
}
29192919

2920-
static void mlxsw_sp_vport_rif_sp_attr_get(struct mlxsw_sp_port *mlxsw_sp_vport,
2921-
bool *p_lagged, u16 *p_system_port)
2922-
{
2923-
u8 local_port = mlxsw_sp_vport->local_port;
2924-
2925-
*p_lagged = mlxsw_sp_vport->lagged;
2926-
*p_system_port = *p_lagged ? mlxsw_sp_vport->lag_id : local_port;
2927-
}
2928-
2929-
static int mlxsw_sp_vport_rif_sp_op(struct mlxsw_sp_port *mlxsw_sp_vport,
2930-
u16 vr_id, struct net_device *l3_dev,
2931-
u16 rif_index, bool create)
2920+
static int
2921+
mlxsw_sp_port_vlan_rif_sp_op(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
2922+
u16 vr_id, struct net_device *l3_dev,
2923+
u16 rif_index, bool create)
29322924
{
2933-
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_vport->mlxsw_sp;
2934-
bool lagged = mlxsw_sp_vport->lagged;
2925+
struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
2926+
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
2927+
bool lagged = mlxsw_sp_port->lagged;
29352928
char ritr_pl[MLXSW_REG_RITR_LEN];
29362929
u16 system_port;
29372930

2931+
system_port = lagged ? mlxsw_sp_port->lag_id :
2932+
mlxsw_sp_port->local_port;
29382933
mlxsw_reg_ritr_pack(ritr_pl, create, MLXSW_REG_RITR_SP_IF, rif_index,
29392934
vr_id, l3_dev->mtu, l3_dev->dev_addr);
2940-
2941-
mlxsw_sp_vport_rif_sp_attr_get(mlxsw_sp_vport, &lagged, &system_port);
29422935
mlxsw_reg_ritr_sp_if_pack(ritr_pl, lagged, system_port,
2943-
mlxsw_sp_vport_vid_get(mlxsw_sp_vport));
2936+
mlxsw_sp_port_vlan->vid);
29442937

29452938
return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl);
29462939
}
@@ -3009,10 +3002,11 @@ int mlxsw_sp_rif_dev_ifindex(const struct mlxsw_sp_rif *rif)
30093002
}
30103003

30113004
static struct mlxsw_sp_rif *
3012-
mlxsw_sp_vport_rif_sp_create(struct mlxsw_sp_port *mlxsw_sp_vport,
3013-
struct net_device *l3_dev)
3005+
mlxsw_sp_port_vlan_rif_sp_create(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
3006+
struct net_device *l3_dev)
30143007
{
3015-
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_vport->mlxsw_sp;
3008+
struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
3009+
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
30163010
u32 tb_id = l3mdev_fib_table(l3_dev);
30173011
struct mlxsw_sp_vr *vr;
30183012
struct mlxsw_sp_fid *f;
@@ -3028,10 +3022,10 @@ mlxsw_sp_vport_rif_sp_create(struct mlxsw_sp_port *mlxsw_sp_vport,
30283022
if (IS_ERR(vr))
30293023
return ERR_CAST(vr);
30303024

3031-
err = mlxsw_sp_vport_rif_sp_op(mlxsw_sp_vport, vr->id, l3_dev,
3032-
rif_index, true);
3025+
err = mlxsw_sp_port_vlan_rif_sp_op(mlxsw_sp_port_vlan, vr->id, l3_dev,
3026+
rif_index, true);
30333027
if (err)
3034-
goto err_vport_rif_sp_op;
3028+
goto err_port_vlan_rif_sp_op;
30353029

30363030
fid = mlxsw_sp_rif_sp_to_fid(rif_index);
30373031
err = mlxsw_sp_rif_fdb_op(mlxsw_sp, l3_dev->dev_addr, fid, true);
@@ -3055,7 +3049,7 @@ mlxsw_sp_vport_rif_sp_create(struct mlxsw_sp_port *mlxsw_sp_vport,
30553049
err = mlxsw_sp_rif_counter_alloc(mlxsw_sp, rif,
30563050
MLXSW_SP_RIF_COUNTER_EGRESS);
30573051
if (err)
3058-
netdev_dbg(mlxsw_sp_vport->dev,
3052+
netdev_dbg(mlxsw_sp_port->dev,
30593053
"Counter alloc Failed err=%d\n", err);
30603054
}
30613055

@@ -3070,17 +3064,19 @@ mlxsw_sp_vport_rif_sp_create(struct mlxsw_sp_port *mlxsw_sp_vport,
30703064
err_rfid_alloc:
30713065
mlxsw_sp_rif_fdb_op(mlxsw_sp, l3_dev->dev_addr, fid, false);
30723066
err_rif_fdb_op:
3073-
mlxsw_sp_vport_rif_sp_op(mlxsw_sp_vport, vr->id, l3_dev, rif_index,
3074-
false);
3075-
err_vport_rif_sp_op:
3067+
mlxsw_sp_port_vlan_rif_sp_op(mlxsw_sp_port_vlan, vr->id, l3_dev,
3068+
rif_index, false);
3069+
err_port_vlan_rif_sp_op:
30763070
mlxsw_sp_vr_put(vr);
30773071
return ERR_PTR(err);
30783072
}
30793073

3080-
static void mlxsw_sp_vport_rif_sp_destroy(struct mlxsw_sp_port *mlxsw_sp_vport,
3081-
struct mlxsw_sp_rif *rif)
3074+
static void
3075+
mlxsw_sp_port_vlan_rif_sp_destroy(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
3076+
struct mlxsw_sp_rif *rif)
30823077
{
3083-
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_vport->mlxsw_sp;
3078+
struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
3079+
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
30843080
struct mlxsw_sp_vr *vr = &mlxsw_sp->router->vrs[rif->vr_id];
30853081
struct net_device *l3_dev = rif->dev;
30863082
struct mlxsw_sp_fid *f = rif->f;
@@ -3102,103 +3098,95 @@ static void mlxsw_sp_vport_rif_sp_destroy(struct mlxsw_sp_port *mlxsw_sp_vport,
31023098

31033099
mlxsw_sp_rif_fdb_op(mlxsw_sp, l3_dev->dev_addr, fid, false);
31043100

3105-
mlxsw_sp_vport_rif_sp_op(mlxsw_sp_vport, vr->id, l3_dev, rif_index,
3106-
false);
3101+
mlxsw_sp_port_vlan_rif_sp_op(mlxsw_sp_port_vlan, vr->id, l3_dev,
3102+
rif_index, false);
3103+
31073104
mlxsw_sp_vr_put(vr);
31083105
}
31093106

3110-
static int mlxsw_sp_vport_rif_sp_join(struct mlxsw_sp_port *mlxsw_sp_vport,
3111-
struct net_device *l3_dev)
3107+
static int
3108+
mlxsw_sp_port_vlan_rif_sp_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
3109+
struct net_device *l3_dev)
31123110
{
3113-
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_vport->mlxsw_sp;
3114-
u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport);
3115-
struct mlxsw_sp_port *mlxsw_sp_port;
3111+
struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
3112+
u16 vid = mlxsw_sp_port_vlan->vid;
31163113
struct mlxsw_sp_rif *rif;
31173114
int err;
31183115

3119-
rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, l3_dev);
3116+
rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp_port->mlxsw_sp, l3_dev);
31203117
if (!rif) {
3121-
rif = mlxsw_sp_vport_rif_sp_create(mlxsw_sp_vport, l3_dev);
3118+
rif = mlxsw_sp_port_vlan_rif_sp_create(mlxsw_sp_port_vlan,
3119+
l3_dev);
31223120
if (IS_ERR(rif))
31233121
return PTR_ERR(rif);
31243122
}
31253123

3126-
err = mlxsw_sp_port_vid_learning_set(mlxsw_sp_vport, vid, false);
3124+
err = mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, false);
31273125
if (err)
31283126
goto err_port_vid_learning_set;
31293127

3130-
err = mlxsw_sp_port_vid_stp_set(mlxsw_sp_vport, vid,
3128+
err = mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid,
31313129
BR_STATE_FORWARDING);
31323130
if (err)
31333131
goto err_port_vid_stp_set;
31343132

3135-
mlxsw_sp_port = mlxsw_sp_vport_port(mlxsw_sp_vport);
31363133
if (mlxsw_sp_port->nr_port_vid_map++ == 0) {
31373134
err = mlxsw_sp_port_vp_mode_trans(mlxsw_sp_port);
31383135
if (err)
31393136
goto err_port_vp_mode_trans;
31403137
}
31413138

3142-
mlxsw_sp_vport_fid_set(mlxsw_sp_vport, rif->f);
3139+
mlxsw_sp_port_vlan->fid = rif->f;
31433140
rif->f->ref_count++;
31443141

3145-
netdev_dbg(mlxsw_sp_vport->dev, "Joined FID=%d\n", rif->f->fid);
3146-
31473142
return 0;
31483143

31493144
err_port_vp_mode_trans:
31503145
mlxsw_sp_port->nr_port_vid_map--;
3151-
mlxsw_sp_port_vid_stp_set(mlxsw_sp_vport, vid, BR_STATE_BLOCKING);
3146+
mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid, BR_STATE_BLOCKING);
31523147
err_port_vid_stp_set:
3153-
mlxsw_sp_port_vid_learning_set(mlxsw_sp_vport, vid, true);
3148+
mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, true);
31543149
err_port_vid_learning_set:
31553150
if (rif->f->ref_count == 0)
3156-
mlxsw_sp_vport_rif_sp_destroy(mlxsw_sp_vport, rif);
3151+
mlxsw_sp_port_vlan_rif_sp_destroy(mlxsw_sp_port_vlan, rif);
31573152
return err;
31583153
}
31593154

31603155
static void
31613156
mlxsw_sp_port_vlan_rif_sp_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
31623157
{
31633158
struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
3164-
struct mlxsw_sp_port *mlxsw_sp_vport;
3159+
struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
31653160
u16 vid = mlxsw_sp_port_vlan->vid;
3166-
struct mlxsw_sp_fid *f;
31673161

3168-
mlxsw_sp_vport = mlxsw_sp_port_vport_find(mlxsw_sp_port, vid);
3169-
f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
3170-
3171-
netdev_dbg(mlxsw_sp_vport->dev, "Left FID=%d\n", f->fid);
3172-
3173-
f->ref_count--;
3174-
mlxsw_sp_vport_fid_set(mlxsw_sp_vport, NULL);
3162+
fid->ref_count--;
3163+
mlxsw_sp_port_vlan->fid = NULL;
31753164

31763165
if (mlxsw_sp_port->nr_port_vid_map == 1)
31773166
mlxsw_sp_port_vlan_mode_trans(mlxsw_sp_port);
31783167
mlxsw_sp_port->nr_port_vid_map--;
3179-
mlxsw_sp_port_vid_stp_set(mlxsw_sp_vport, vid, BR_STATE_BLOCKING);
3180-
mlxsw_sp_port_vid_learning_set(mlxsw_sp_vport, vid, true);
3168+
mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid, BR_STATE_BLOCKING);
3169+
mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, true);
31813170

3182-
if (f->ref_count == 0)
3183-
mlxsw_sp_vport_rif_sp_destroy(mlxsw_sp_vport, f->rif);
3171+
if (fid->ref_count == 0)
3172+
mlxsw_sp_port_vlan_rif_sp_destroy(mlxsw_sp_port_vlan, fid->rif);
31843173
}
31853174

3186-
static int mlxsw_sp_inetaddr_vport_event(struct net_device *l3_dev,
3187-
struct net_device *port_dev,
3188-
unsigned long event, u16 vid)
3175+
static int mlxsw_sp_inetaddr_port_vlan_event(struct net_device *l3_dev,
3176+
struct net_device *port_dev,
3177+
unsigned long event, u16 vid)
31893178
{
31903179
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(port_dev);
31913180
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
3192-
struct mlxsw_sp_port *mlxsw_sp_vport;
31933181

3194-
mlxsw_sp_vport = mlxsw_sp_port_vport_find(mlxsw_sp_port, vid);
3195-
if (WARN_ON(!mlxsw_sp_vport))
3196-
return -EINVAL;
31973182
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
3183+
if (WARN_ON(!mlxsw_sp_port_vlan))
3184+
return -EINVAL;
31983185

31993186
switch (event) {
32003187
case NETDEV_UP:
3201-
return mlxsw_sp_vport_rif_sp_join(mlxsw_sp_vport, l3_dev);
3188+
return mlxsw_sp_port_vlan_rif_sp_join(mlxsw_sp_port_vlan,
3189+
l3_dev);
32023190
case NETDEV_DOWN:
32033191
mlxsw_sp_port_vlan_rif_sp_leave(mlxsw_sp_port_vlan);
32043192
break;
@@ -3215,7 +3203,7 @@ static int mlxsw_sp_inetaddr_port_event(struct net_device *port_dev,
32153203
netif_is_ovs_port(port_dev))
32163204
return 0;
32173205

3218-
return mlxsw_sp_inetaddr_vport_event(port_dev, port_dev, event, 1);
3206+
return mlxsw_sp_inetaddr_port_vlan_event(port_dev, port_dev, event, 1);
32193207
}
32203208

32213209
static int __mlxsw_sp_inetaddr_lag_event(struct net_device *l3_dev,
@@ -3228,8 +3216,9 @@ static int __mlxsw_sp_inetaddr_lag_event(struct net_device *l3_dev,
32283216

32293217
netdev_for_each_lower_dev(lag_dev, port_dev, iter) {
32303218
if (mlxsw_sp_port_dev_check(port_dev)) {
3231-
err = mlxsw_sp_inetaddr_vport_event(l3_dev, port_dev,
3232-
event, vid);
3219+
err = mlxsw_sp_inetaddr_port_vlan_event(l3_dev,
3220+
port_dev,
3221+
event, vid);
32333222
if (err)
32343223
return err;
32353224
}
@@ -3444,8 +3433,8 @@ static int mlxsw_sp_inetaddr_vlan_event(struct net_device *vlan_dev,
34443433
u16 vid = vlan_dev_vlan_id(vlan_dev);
34453434

34463435
if (mlxsw_sp_port_dev_check(real_dev))
3447-
return mlxsw_sp_inetaddr_vport_event(vlan_dev, real_dev, event,
3448-
vid);
3436+
return mlxsw_sp_inetaddr_port_vlan_event(vlan_dev, real_dev,
3437+
event, vid);
34493438
else if (netif_is_lag_master(real_dev))
34503439
return __mlxsw_sp_inetaddr_lag_event(vlan_dev, real_dev, event,
34513440
vid);

0 commit comments

Comments
 (0)