summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.c229
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.h24
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c28
3 files changed, 131 insertions, 150 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 7a75a45bdfbb..8ef8d0bcb08b 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -633,14 +633,14 @@ static int mlxsw_sp_port_vlan_mode_trans(struct mlxsw_sp_port *mlxsw_sp_port)
return 0;
}
-static struct mlxsw_sp_vfid *
+static struct mlxsw_sp_fid *
mlxsw_sp_vfid_find(const struct mlxsw_sp *mlxsw_sp, u16 vid)
{
- struct mlxsw_sp_vfid *vfid;
+ struct mlxsw_sp_fid *f;
- list_for_each_entry(vfid, &mlxsw_sp->port_vfids.list, list) {
- if (vfid->vid == vid)
- return vfid;
+ list_for_each_entry(f, &mlxsw_sp->port_vfids.list, list) {
+ if (f->vid == vid)
+ return f;
}
return NULL;
@@ -660,11 +660,11 @@ static int mlxsw_sp_vfid_op(struct mlxsw_sp *mlxsw_sp, u16 fid, bool create)
return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfmr), sfmr_pl);
}
-static struct mlxsw_sp_vfid *mlxsw_sp_vfid_create(struct mlxsw_sp *mlxsw_sp,
- u16 vid)
+static struct mlxsw_sp_fid *mlxsw_sp_vfid_create(struct mlxsw_sp *mlxsw_sp,
+ u16 vid)
{
struct device *dev = mlxsw_sp->bus_info->dev;
- struct mlxsw_sp_vfid *f;
+ struct mlxsw_sp_fid *f;
u16 vfid, fid;
int err;
@@ -685,7 +685,7 @@ static struct mlxsw_sp_vfid *mlxsw_sp_vfid_create(struct mlxsw_sp *mlxsw_sp,
if (!f)
goto err_allocate_vfid;
- f->vfid = vfid;
+ f->fid = fid;
f->vid = vid;
list_add(&f->list, &mlxsw_sp->port_vfids.list);
@@ -699,21 +699,21 @@ err_allocate_vfid:
}
static void mlxsw_sp_vfid_destroy(struct mlxsw_sp *mlxsw_sp,
- struct mlxsw_sp_vfid *vfid)
+ struct mlxsw_sp_fid *f)
{
- u16 fid = mlxsw_sp_vfid_to_fid(vfid->vfid);
+ u16 vfid = mlxsw_sp_fid_to_vfid(f->fid);
- clear_bit(vfid->vfid, mlxsw_sp->port_vfids.mapped);
- list_del(&vfid->list);
+ clear_bit(vfid, mlxsw_sp->port_vfids.mapped);
+ list_del(&f->list);
- mlxsw_sp_vfid_op(mlxsw_sp, fid, false);
+ mlxsw_sp_vfid_op(mlxsw_sp, f->fid, false);
- kfree(vfid);
+ kfree(f);
}
static struct mlxsw_sp_port *
mlxsw_sp_port_vport_create(struct mlxsw_sp_port *mlxsw_sp_port,
- struct mlxsw_sp_vfid *vfid)
+ struct mlxsw_sp_fid *f)
{
struct mlxsw_sp_port *mlxsw_sp_vport;
@@ -731,8 +731,8 @@ mlxsw_sp_port_vport_create(struct mlxsw_sp_port *mlxsw_sp_port,
mlxsw_sp_vport->stp_state = BR_STATE_FORWARDING;
mlxsw_sp_vport->lagged = mlxsw_sp_port->lagged;
mlxsw_sp_vport->lag_id = mlxsw_sp_port->lag_id;
- mlxsw_sp_vport->vport.vfid = vfid;
- mlxsw_sp_vport->vport.vid = vfid->vid;
+ mlxsw_sp_vport->vport.f = f;
+ mlxsw_sp_vport->vport.vid = f->vid;
list_add(&mlxsw_sp_vport->vport.list, &mlxsw_sp_port->vports_list);
@@ -761,8 +761,7 @@ int mlxsw_sp_port_add_vid(struct net_device *dev, __be16 __always_unused proto,
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
struct mlxsw_sp_port *mlxsw_sp_vport;
- struct mlxsw_sp_vfid *vfid;
- u16 fid;
+ struct mlxsw_sp_fid *f;
int err;
/* VLAN 0 is added to HW filter when device goes up, but it is
@@ -776,29 +775,28 @@ int mlxsw_sp_port_add_vid(struct net_device *dev, __be16 __always_unused proto,
return 0;
}
- vfid = mlxsw_sp_vfid_find(mlxsw_sp, vid);
- if (!vfid) {
- vfid = mlxsw_sp_vfid_create(mlxsw_sp, vid);
- if (IS_ERR(vfid)) {
+ f = mlxsw_sp_vfid_find(mlxsw_sp, vid);
+ if (!f) {
+ f = mlxsw_sp_vfid_create(mlxsw_sp, vid);
+ if (IS_ERR(f)) {
netdev_err(dev, "Failed to create vFID for VID=%d\n",
vid);
- return PTR_ERR(vfid);
+ return PTR_ERR(f);
}
}
- mlxsw_sp_vport = mlxsw_sp_port_vport_create(mlxsw_sp_port, vfid);
+ mlxsw_sp_vport = mlxsw_sp_port_vport_create(mlxsw_sp_port, f);
if (!mlxsw_sp_vport) {
netdev_err(dev, "Failed to create vPort for VID=%d\n", vid);
err = -ENOMEM;
goto err_port_vport_create;
}
- fid = mlxsw_sp_vfid_to_fid(vfid->vfid);
- if (!vfid->nr_vports) {
- err = mlxsw_sp_vport_flood_set(mlxsw_sp_vport, fid, true);
+ if (!f->ref_count) {
+ err = mlxsw_sp_vport_flood_set(mlxsw_sp_vport, f->fid, true);
if (err) {
- netdev_err(dev, "Failed to setup flooding for vFID=%d\n",
- vfid->vfid);
+ netdev_err(dev, "Failed to setup flooding for FID=%d\n",
+ f->fid);
goto err_vport_flood_set;
}
}
@@ -815,10 +813,10 @@ int mlxsw_sp_port_add_vid(struct net_device *dev, __be16 __always_unused proto,
}
}
- err = mlxsw_sp_vport_fid_map(mlxsw_sp_vport, fid, true);
+ err = mlxsw_sp_vport_fid_map(mlxsw_sp_vport, f->fid, true);
if (err) {
- netdev_err(dev, "Failed to map {Port, VID=%d} to vFID=%d\n",
- vid, vfid->vfid);
+ netdev_err(dev, "Failed to map {Port, VID=%d} to FID=%d\n",
+ vid, f->fid);
goto err_vport_fid_map;
}
@@ -842,7 +840,7 @@ int mlxsw_sp_port_add_vid(struct net_device *dev, __be16 __always_unused proto,
goto err_port_stp_state_set;
}
- vfid->nr_vports++;
+ f->ref_count++;
return 0;
@@ -851,18 +849,18 @@ err_port_stp_state_set:
err_port_add_vid:
mlxsw_sp_port_vid_learning_set(mlxsw_sp_vport, vid, true);
err_port_vid_learning_set:
- mlxsw_sp_vport_fid_map(mlxsw_sp_vport, fid, false);
+ mlxsw_sp_vport_fid_map(mlxsw_sp_vport, f->fid, false);
err_vport_fid_map:
if (list_is_singular(&mlxsw_sp_port->vports_list))
mlxsw_sp_port_vlan_mode_trans(mlxsw_sp_port);
err_port_vp_mode_trans:
- if (!vfid->nr_vports)
- mlxsw_sp_vport_flood_set(mlxsw_sp_vport, fid, false);
+ if (!f->ref_count)
+ mlxsw_sp_vport_flood_set(mlxsw_sp_vport, f->fid, false);
err_vport_flood_set:
mlxsw_sp_port_vport_destroy(mlxsw_sp_vport);
err_port_vport_create:
- if (!vfid->nr_vports)
- mlxsw_sp_vfid_destroy(mlxsw_sp, vfid);
+ if (!f->ref_count)
+ mlxsw_sp_vfid_destroy(mlxsw_sp, f);
return err;
}
@@ -871,8 +869,7 @@ int mlxsw_sp_port_kill_vid(struct net_device *dev,
{
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
struct mlxsw_sp_port *mlxsw_sp_vport;
- struct mlxsw_sp_vfid *vfid;
- u16 fid;
+ struct mlxsw_sp_fid *f;
int err;
/* VLAN 0 is removed from HW filter when device goes down, but
@@ -887,7 +884,7 @@ int mlxsw_sp_port_kill_vid(struct net_device *dev,
return 0;
}
- vfid = mlxsw_sp_vport->vport.vfid;
+ f = mlxsw_sp_vport->vport.f;
err = mlxsw_sp_port_stp_state_set(mlxsw_sp_vport, vid,
MLXSW_REG_SPMS_STATE_DISCARDING);
@@ -909,11 +906,10 @@ int mlxsw_sp_port_kill_vid(struct net_device *dev,
return err;
}
- fid = mlxsw_sp_vfid_to_fid(vfid->vfid);
- err = mlxsw_sp_vport_fid_map(mlxsw_sp_vport, fid, false);
+ err = mlxsw_sp_vport_fid_map(mlxsw_sp_vport, f->fid, false);
if (err) {
- netdev_err(dev, "Failed to invalidate {Port, VID=%d} to vFID=%d mapping\n",
- vid, vfid->vfid);
+ netdev_err(dev, "Failed to invalidate {Port, VID=%d} to FID=%d mapping\n",
+ vid, f->fid);
return err;
}
@@ -929,12 +925,12 @@ int mlxsw_sp_port_kill_vid(struct net_device *dev,
}
}
- vfid->nr_vports--;
+ f->ref_count--;
mlxsw_sp_port_vport_destroy(mlxsw_sp_vport);
/* Destroy the vFID if no vPorts are assigned to it anymore. */
- if (!vfid->nr_vports)
- mlxsw_sp_vfid_destroy(mlxsw_sp_port->mlxsw_sp, vfid);
+ if (!f->ref_count)
+ mlxsw_sp_vfid_destroy(mlxsw_sp_port->mlxsw_sp, f);
return 0;
}
@@ -2631,8 +2627,7 @@ static int mlxsw_sp_port_fdb_flush(struct mlxsw_sp_port *mlxsw_sp_port)
static int mlxsw_sp_vport_fdb_flush(struct mlxsw_sp_port *mlxsw_sp_vport)
{
- u16 vfid = mlxsw_sp_vport_vfid_get(mlxsw_sp_vport);
- u16 fid = mlxsw_sp_vfid_to_fid(vfid);
+ u16 fid = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
if (mlxsw_sp_vport->lagged)
return mlxsw_sp_port_fdb_flush_by_lag_id_fid(mlxsw_sp_vport,
@@ -3126,15 +3121,15 @@ static int mlxsw_sp_netdevice_lag_event(struct net_device *lag_dev,
return 0;
}
-static struct mlxsw_sp_vfid *
+static struct mlxsw_sp_fid *
mlxsw_sp_br_vfid_find(const struct mlxsw_sp *mlxsw_sp,
const struct net_device *br_dev)
{
- struct mlxsw_sp_vfid *vfid;
+ struct mlxsw_sp_fid *f;
- list_for_each_entry(vfid, &mlxsw_sp->br_vfids.list, list) {
- if (vfid->br_dev == br_dev)
- return vfid;
+ list_for_each_entry(f, &mlxsw_sp->br_vfids.list, list) {
+ if (f->dev == br_dev)
+ return f;
}
return NULL;
@@ -3156,11 +3151,11 @@ static u16 mlxsw_sp_avail_br_vfid_get(const struct mlxsw_sp *mlxsw_sp)
MLXSW_SP_VFID_BR_MAX);
}
-static struct mlxsw_sp_vfid *mlxsw_sp_br_vfid_create(struct mlxsw_sp *mlxsw_sp,
- struct net_device *br_dev)
+static struct mlxsw_sp_fid *mlxsw_sp_br_vfid_create(struct mlxsw_sp *mlxsw_sp,
+ struct net_device *br_dev)
{
struct device *dev = mlxsw_sp->bus_info->dev;
- struct mlxsw_sp_vfid *f;
+ struct mlxsw_sp_fid *f;
u16 vfid, fid;
int err;
@@ -3181,8 +3176,8 @@ static struct mlxsw_sp_vfid *mlxsw_sp_br_vfid_create(struct mlxsw_sp *mlxsw_sp,
if (!f)
goto err_allocate_vfid;
- f->vfid = vfid;
- f->br_dev = br_dev;
+ f->fid = fid;
+ f->dev = br_dev;
list_add(&f->list, &mlxsw_sp->br_vfids.list);
set_bit(mlxsw_sp_vfid_to_br_vfid(vfid), mlxsw_sp->br_vfids.mapped);
@@ -3195,17 +3190,17 @@ err_allocate_vfid:
}
static void mlxsw_sp_br_vfid_destroy(struct mlxsw_sp *mlxsw_sp,
- struct mlxsw_sp_vfid *vfid)
+ struct mlxsw_sp_fid *f)
{
- u16 br_vfid = mlxsw_sp_vfid_to_br_vfid(vfid->vfid);
- u16 fid = mlxsw_sp_vfid_to_fid(vfid->vfid);
+ u16 vfid = mlxsw_sp_fid_to_vfid(f->fid);
+ u16 br_vfid = mlxsw_sp_vfid_to_br_vfid(vfid);
clear_bit(br_vfid, mlxsw_sp->br_vfids.mapped);
- list_del(&vfid->list);
+ list_del(&f->list);
- mlxsw_sp_vfid_op(mlxsw_sp, fid, false);
+ mlxsw_sp_vfid_op(mlxsw_sp, f->fid, false);
- kfree(vfid);
+ kfree(f);
}
static void mlxsw_sp_vport_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_vport,
@@ -3215,19 +3210,18 @@ static void mlxsw_sp_vport_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_vport,
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_vport->mlxsw_sp;
u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport);
struct net_device *dev = mlxsw_sp_vport->dev;
- struct mlxsw_sp_vfid *vfid, *new_vfid;
- u16 fid, new_fid;
+ struct mlxsw_sp_fid *f, *new_f;
int err;
- vfid = mlxsw_sp_br_vfid_find(mlxsw_sp, br_dev);
- if (WARN_ON(!vfid))
+ f = mlxsw_sp_br_vfid_find(mlxsw_sp, br_dev);
+ if (WARN_ON(!f))
return;
/* We need a vFID to go back to after leaving the bridge's vFID. */
- new_vfid = mlxsw_sp_vfid_find(mlxsw_sp, vid);
- if (!new_vfid) {
- new_vfid = mlxsw_sp_vfid_create(mlxsw_sp, vid);
- if (IS_ERR(new_vfid)) {
+ new_f = mlxsw_sp_vfid_find(mlxsw_sp, vid);
+ if (!new_f) {
+ new_f = mlxsw_sp_vfid_create(mlxsw_sp, vid);
+ if (IS_ERR(new_f)) {
netdev_err(dev, "Failed to create vFID for VID=%d\n",
vid);
return;
@@ -3237,19 +3231,17 @@ static void mlxsw_sp_vport_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_vport,
/* Invalidate existing {Port, VID} to vFID mapping and create a new
* one for the new vFID.
*/
- fid = mlxsw_sp_vfid_to_fid(vfid->vfid);
- err = mlxsw_sp_vport_fid_map(mlxsw_sp_vport, fid, false);
+ err = mlxsw_sp_vport_fid_map(mlxsw_sp_vport, f->fid, false);
if (err) {
- netdev_err(dev, "Failed to invalidate {Port, VID} to vFID=%d mapping\n",
- vfid->vfid);
+ netdev_err(dev, "Failed to invalidate {Port, VID} to FID=%d mapping\n",
+ f->fid);
goto err_vport_fid_unmap;
}
- new_fid = mlxsw_sp_vfid_to_fid(new_vfid->vfid);
- err = mlxsw_sp_vport_fid_map(mlxsw_sp_vport, new_fid, true);
+ err = mlxsw_sp_vport_fid_map(mlxsw_sp_vport, new_f->fid, true);
if (err) {
- netdev_err(dev, "Failed to map {Port, VID} to vFID=%d\n",
- new_vfid->vfid);
+ netdev_err(dev, "Failed to map {Port, VID} to FID=%d\n",
+ new_f->fid);
goto err_vport_fid_map;
}
@@ -3259,7 +3251,7 @@ static void mlxsw_sp_vport_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_vport,
goto err_port_vid_learning_set;
}
- err = mlxsw_sp_vport_flood_set(mlxsw_sp_vport, fid, false);
+ err = mlxsw_sp_vport_flood_set(mlxsw_sp_vport, f->fid, false);
if (err) {
netdev_err(dev, "Failed clear to clear flooding\n");
goto err_vport_flood_set;
@@ -3276,11 +3268,11 @@ static void mlxsw_sp_vport_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_vport,
netdev_err(dev, "Failed to flush FDB\n");
/* Switch between the vFIDs and destroy the old one if needed. */
- new_vfid->nr_vports++;
- mlxsw_sp_vport->vport.vfid = new_vfid;
- vfid->nr_vports--;
- if (!vfid->nr_vports)
- mlxsw_sp_br_vfid_destroy(mlxsw_sp, vfid);
+ new_f->ref_count++;
+ mlxsw_sp_vport->vport.f = new_f;
+ f->ref_count--;
+ if (!f->ref_count)
+ mlxsw_sp_br_vfid_destroy(mlxsw_sp, f);
mlxsw_sp_vport->learning = 0;
mlxsw_sp_vport->learning_sync = 0;
@@ -3295,35 +3287,33 @@ err_port_vid_learning_set:
err_vport_fid_map:
err_vport_fid_unmap:
/* Rollback vFID only if new. */
- if (!new_vfid->nr_vports)
- mlxsw_sp_vfid_destroy(mlxsw_sp, new_vfid);
+ if (!new_f->ref_count)
+ mlxsw_sp_vfid_destroy(mlxsw_sp, new_f);
}
static int mlxsw_sp_vport_bridge_join(struct mlxsw_sp_port *mlxsw_sp_vport,
struct net_device *br_dev)
{
- struct mlxsw_sp_vfid *old_vfid = mlxsw_sp_vport->vport.vfid;
+ struct mlxsw_sp_fid *old_f = mlxsw_sp_vport->vport.f;
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_vport->mlxsw_sp;
u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport);
struct net_device *dev = mlxsw_sp_vport->dev;
- struct mlxsw_sp_vfid *vfid;
- u16 fid, old_fid;
+ struct mlxsw_sp_fid *f;
int err;
- vfid = mlxsw_sp_br_vfid_find(mlxsw_sp, br_dev);
- if (!vfid) {
- vfid = mlxsw_sp_br_vfid_create(mlxsw_sp, br_dev);
- if (IS_ERR(vfid)) {
+ f = mlxsw_sp_br_vfid_find(mlxsw_sp, br_dev);
+ if (!f) {
+ f = mlxsw_sp_br_vfid_create(mlxsw_sp, br_dev);
+ if (IS_ERR(f)) {
netdev_err(dev, "Failed to create bridge vFID\n");
- return PTR_ERR(vfid);
+ return PTR_ERR(f);
}
}
- fid = mlxsw_sp_vfid_to_fid(vfid->vfid);
- err = mlxsw_sp_vport_flood_set(mlxsw_sp_vport, fid, true);
+ err = mlxsw_sp_vport_flood_set(mlxsw_sp_vport, f->fid, true);
if (err) {
- netdev_err(dev, "Failed to setup flooding for vFID=%d\n",
- vfid->vfid);
+ netdev_err(dev, "Failed to setup flooding for FID=%d\n",
+ f->fid);
goto err_port_flood_set;
}
@@ -3336,27 +3326,26 @@ static int mlxsw_sp_vport_bridge_join(struct mlxsw_sp_port *mlxsw_sp_vport,
/* We need to invalidate existing {Port, VID} to vFID mapping and
* create a new one for the bridge's vFID.
*/
- old_fid = mlxsw_sp_vfid_to_fid(old_vfid->vfid);
- err = mlxsw_sp_vport_fid_map(mlxsw_sp_vport, old_fid, false);
+ err = mlxsw_sp_vport_fid_map(mlxsw_sp_vport, old_f->fid, false);
if (err) {
- netdev_err(dev, "Failed to invalidate {Port, VID} to vFID=%d mapping\n",
- old_vfid->vfid);
+ netdev_err(dev, "Failed to invalidate {Port, VID} to FID=%d mapping\n",
+ old_f->fid);
goto err_vport_fid_unmap;
}
- err = mlxsw_sp_vport_fid_map(mlxsw_sp_vport, fid, true);
+ err = mlxsw_sp_vport_fid_map(mlxsw_sp_vport, f->fid, true);
if (err) {
- netdev_err(dev, "Failed to map {Port, VID} to vFID=%d\n",
- vfid->vfid);
+ netdev_err(dev, "Failed to map {Port, VID} to FID=%d\n",
+ f->fid);
goto err_vport_fid_map;
}
/* Switch between the vFIDs and destroy the old one if needed. */
- vfid->nr_vports++;
- mlxsw_sp_vport->vport.vfid = vfid;
- old_vfid->nr_vports--;
- if (!old_vfid->nr_vports)
- mlxsw_sp_vfid_destroy(mlxsw_sp, old_vfid);
+ f->ref_count++;
+ mlxsw_sp_vport->vport.f = f;
+ old_f->ref_count--;
+ if (!old_f->ref_count)
+ mlxsw_sp_vfid_destroy(mlxsw_sp, old_f);
mlxsw_sp_vport->learning = 1;
mlxsw_sp_vport->learning_sync = 1;
@@ -3366,14 +3355,14 @@ static int mlxsw_sp_vport_bridge_join(struct mlxsw_sp_port *mlxsw_sp_vport,
return 0;
err_vport_fid_map:
- mlxsw_sp_vport_fid_map(mlxsw_sp_vport, old_fid, true);
+ mlxsw_sp_vport_fid_map(mlxsw_sp_vport, old_f->fid, true);
err_vport_fid_unmap:
mlxsw_sp_port_vid_learning_set(mlxsw_sp_vport, vid, false);
err_port_vid_learning_set:
- mlxsw_sp_vport_flood_set(mlxsw_sp_vport, fid, false);
+ mlxsw_sp_vport_flood_set(mlxsw_sp_vport, f->fid, false);
err_port_flood_set:
- if (!vfid->nr_vports)
- mlxsw_sp_br_vfid_destroy(mlxsw_sp, vfid);
+ if (!f->ref_count)
+ mlxsw_sp_br_vfid_destroy(mlxsw_sp, f);
return err;
}
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
index 0ae929ee2057..c973ab5c59ca 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
@@ -87,11 +87,11 @@ struct mlxsw_sp_upper {
unsigned int ref_count;
};
-struct mlxsw_sp_vfid {
+struct mlxsw_sp_fid {
struct list_head list;
- u16 nr_vports;
- u16 vfid; /* Starting at 0 */
- struct net_device *br_dev;
+ unsigned int ref_count;
+ struct net_device *dev;
+ u16 fid;
u16 vid;
};
@@ -217,7 +217,7 @@ struct mlxsw_sp_port {
u16 lag_id;
struct {
struct list_head list;
- struct mlxsw_sp_vfid *vfid;
+ struct mlxsw_sp_fid *f;
u16 vid;
} vport;
struct {
@@ -262,13 +262,13 @@ mlxsw_sp_port_lagged_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id, u8 port_index)
static inline bool
mlxsw_sp_port_is_vport(const struct mlxsw_sp_port *mlxsw_sp_port)
{
- return mlxsw_sp_port->vport.vfid;
+ return mlxsw_sp_port->vport.f;
}
static inline struct net_device *
mlxsw_sp_vport_br_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
{
- return mlxsw_sp_vport->vport.vfid->br_dev;
+ return mlxsw_sp_vport->vport.f->dev;
}
static inline u16
@@ -278,9 +278,9 @@ mlxsw_sp_vport_vid_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
}
static inline u16
-mlxsw_sp_vport_vfid_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
+mlxsw_sp_vport_fid_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
{
- return mlxsw_sp_vport->vport.vfid->vfid;
+ return mlxsw_sp_vport->vport.f->fid;
}
static inline struct mlxsw_sp_port *
@@ -298,14 +298,14 @@ mlxsw_sp_port_vport_find(const struct mlxsw_sp_port *mlxsw_sp_port, u16 vid)
}
static inline struct mlxsw_sp_port *
-mlxsw_sp_port_vport_find_by_vfid(const struct mlxsw_sp_port *mlxsw_sp_port,
- u16 vfid)
+mlxsw_sp_port_vport_find_by_fid(const struct mlxsw_sp_port *mlxsw_sp_port,
+ u16 fid)
{
struct mlxsw_sp_port *mlxsw_sp_vport;
list_for_each_entry(mlxsw_sp_vport, &mlxsw_sp_port->vports_list,
vport.list) {
- if (mlxsw_sp_vport_vfid_get(mlxsw_sp_vport) == vfid)
+ if (mlxsw_sp_vport_fid_get(mlxsw_sp_vport) == fid)
return mlxsw_sp_vport;
}
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
index 76f53c26db80..3e9ba581a252 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
@@ -57,11 +57,8 @@ static u16 mlxsw_sp_port_vid_to_fid_get(struct mlxsw_sp_port *mlxsw_sp_port,
{
u16 fid = vid;
- if (mlxsw_sp_port_is_vport(mlxsw_sp_port)) {
- u16 vfid = mlxsw_sp_vport_vfid_get(mlxsw_sp_port);
-
- fid = mlxsw_sp_vfid_to_fid(vfid);
- }
+ if (mlxsw_sp_port_is_vport(mlxsw_sp_port))
+ fid = mlxsw_sp_vport_fid_get(mlxsw_sp_port);
if (!fid)
fid = mlxsw_sp_port->pvid;
@@ -236,8 +233,9 @@ static int mlxsw_sp_port_uc_flood_set(struct mlxsw_sp_port *mlxsw_sp_port,
int err;
if (mlxsw_sp_port_is_vport(mlxsw_sp_port)) {
- u16 vfid = mlxsw_sp_vport_vfid_get(mlxsw_sp_port);
+ u16 vfid, fid = mlxsw_sp_vport_fid_get(mlxsw_sp_port);
+ vfid = mlxsw_sp_fid_to_vfid(fid);
return __mlxsw_sp_port_flood_set(mlxsw_sp_port, vfid, vfid,
set, true);
}
@@ -1136,12 +1134,8 @@ static int mlxsw_sp_port_fdb_dump(struct mlxsw_sp_port *mlxsw_sp_port,
if (!sfd_pl)
return -ENOMEM;
- if (mlxsw_sp_port_is_vport(mlxsw_sp_port)) {
- u16 tmp;
-
- tmp = mlxsw_sp_vport_vfid_get(mlxsw_sp_port);
- vport_fid = mlxsw_sp_vfid_to_fid(tmp);
- }
+ if (mlxsw_sp_port_is_vport(mlxsw_sp_port))
+ vport_fid = mlxsw_sp_vport_fid_get(mlxsw_sp_port);
mlxsw_reg_sfd_pack(sfd_pl, MLXSW_REG_SFD_OP_QUERY_DUMP, 0);
do {
@@ -1313,11 +1307,10 @@ static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp,
}
if (mlxsw_sp_fid_is_vfid(fid)) {
- u16 vfid = mlxsw_sp_fid_to_vfid(fid);
struct mlxsw_sp_port *mlxsw_sp_vport;
- mlxsw_sp_vport = mlxsw_sp_port_vport_find_by_vfid(mlxsw_sp_port,
- vfid);
+ mlxsw_sp_vport = mlxsw_sp_port_vport_find_by_fid(mlxsw_sp_port,
+ fid);
if (!mlxsw_sp_vport) {
netdev_err(mlxsw_sp_port->dev, "Failed to find a matching vPort following FDB notification\n");
goto just_remove;
@@ -1373,11 +1366,10 @@ static void mlxsw_sp_fdb_notify_mac_lag_process(struct mlxsw_sp *mlxsw_sp,
}
if (mlxsw_sp_fid_is_vfid(fid)) {
- u16 vfid = mlxsw_sp_fid_to_vfid(fid);
struct mlxsw_sp_port *mlxsw_sp_vport;
- mlxsw_sp_vport = mlxsw_sp_port_vport_find_by_vfid(mlxsw_sp_port,
- vfid);
+ mlxsw_sp_vport = mlxsw_sp_port_vport_find_by_fid(mlxsw_sp_port,
+ fid);
if (!mlxsw_sp_vport) {
netdev_err(mlxsw_sp_port->dev, "Failed to find a matching vPort following FDB notification\n");
goto just_remove;