Commit a52b2da7 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by Jakub Kicinski

net: dsa: remove the transactional logic from MDB entries

For many drivers, the .port_mdb_prepare callback was not a good opportunity
to avoid any error condition, and they would suppress errors found during
the actual commit phase.

Where a logical separation between the prepare and the commit phase
existed, the function that used to implement the .port_mdb_prepare
callback still exists, but now it is called directly from .port_mdb_add,
which was modified to return an int code.
Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Acked-by: default avatarJiri Pirko <jiri@nvidia.com>
Reviewed-by: Kurt Kanzenbach <kurt@linutronix.de> # hellcreek
Reviewed-by: Linus Wallei <linus.walleij@linaro.org> # RTL8366
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 77b61365
...@@ -1741,8 +1741,8 @@ int b53_fdb_dump(struct dsa_switch *ds, int port, ...@@ -1741,8 +1741,8 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,
} }
EXPORT_SYMBOL(b53_fdb_dump); EXPORT_SYMBOL(b53_fdb_dump);
int b53_mdb_prepare(struct dsa_switch *ds, int port, int b53_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb) const struct switchdev_obj_port_mdb *mdb)
{ {
struct b53_device *priv = ds->priv; struct b53_device *priv = ds->priv;
...@@ -1752,19 +1752,7 @@ int b53_mdb_prepare(struct dsa_switch *ds, int port, ...@@ -1752,19 +1752,7 @@ int b53_mdb_prepare(struct dsa_switch *ds, int port,
if (is5325(priv) || is5365(priv)) if (is5325(priv) || is5365(priv))
return -EOPNOTSUPP; return -EOPNOTSUPP;
return 0; return b53_arl_op(priv, 0, port, mdb->addr, mdb->vid, true);
}
EXPORT_SYMBOL(b53_mdb_prepare);
void b53_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb)
{
struct b53_device *priv = ds->priv;
int ret;
ret = b53_arl_op(priv, 0, port, mdb->addr, mdb->vid, true);
if (ret)
dev_err(ds->dev, "failed to add MDB entry\n");
} }
EXPORT_SYMBOL(b53_mdb_add); EXPORT_SYMBOL(b53_mdb_add);
...@@ -2205,7 +2193,6 @@ static const struct dsa_switch_ops b53_switch_ops = { ...@@ -2205,7 +2193,6 @@ static const struct dsa_switch_ops b53_switch_ops = {
.port_fdb_del = b53_fdb_del, .port_fdb_del = b53_fdb_del,
.port_mirror_add = b53_mirror_add, .port_mirror_add = b53_mirror_add,
.port_mirror_del = b53_mirror_del, .port_mirror_del = b53_mirror_del,
.port_mdb_prepare = b53_mdb_prepare,
.port_mdb_add = b53_mdb_add, .port_mdb_add = b53_mdb_add,
.port_mdb_del = b53_mdb_del, .port_mdb_del = b53_mdb_del,
.port_max_mtu = b53_get_max_mtu, .port_max_mtu = b53_get_max_mtu,
......
...@@ -361,10 +361,8 @@ int b53_fdb_del(struct dsa_switch *ds, int port, ...@@ -361,10 +361,8 @@ int b53_fdb_del(struct dsa_switch *ds, int port,
const unsigned char *addr, u16 vid); const unsigned char *addr, u16 vid);
int b53_fdb_dump(struct dsa_switch *ds, int port, int b53_fdb_dump(struct dsa_switch *ds, int port,
dsa_fdb_dump_cb_t *cb, void *data); dsa_fdb_dump_cb_t *cb, void *data);
int b53_mdb_prepare(struct dsa_switch *ds, int port, int b53_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb); const struct switchdev_obj_port_mdb *mdb);
void b53_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb);
int b53_mdb_del(struct dsa_switch *ds, int port, int b53_mdb_del(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb); const struct switchdev_obj_port_mdb *mdb);
int b53_mirror_add(struct dsa_switch *ds, int port, int b53_mirror_add(struct dsa_switch *ds, int port,
......
...@@ -1126,7 +1126,6 @@ static const struct dsa_switch_ops bcm_sf2_ops = { ...@@ -1126,7 +1126,6 @@ static const struct dsa_switch_ops bcm_sf2_ops = {
.set_rxnfc = bcm_sf2_set_rxnfc, .set_rxnfc = bcm_sf2_set_rxnfc,
.port_mirror_add = b53_mirror_add, .port_mirror_add = b53_mirror_add,
.port_mirror_del = b53_mirror_del, .port_mirror_del = b53_mirror_del,
.port_mdb_prepare = b53_mdb_prepare,
.port_mdb_add = b53_mdb_add, .port_mdb_add = b53_mdb_add,
.port_mdb_del = b53_mdb_del, .port_mdb_del = b53_mdb_del,
}; };
......
...@@ -1232,14 +1232,19 @@ static int lan9303_port_mdb_prepare(struct dsa_switch *ds, int port, ...@@ -1232,14 +1232,19 @@ static int lan9303_port_mdb_prepare(struct dsa_switch *ds, int port,
return 0; return 0;
} }
static void lan9303_port_mdb_add(struct dsa_switch *ds, int port, static int lan9303_port_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb) const struct switchdev_obj_port_mdb *mdb)
{ {
struct lan9303 *chip = ds->priv; struct lan9303 *chip = ds->priv;
int err;
err = lan9303_port_mdb_prepare(ds, port, mdb);
if (err)
return err;
dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, mdb->addr, dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, mdb->addr,
mdb->vid); mdb->vid);
lan9303_alr_add_port(chip, mdb->addr, port, false); return lan9303_alr_add_port(chip, mdb->addr, port, false);
} }
static int lan9303_port_mdb_del(struct dsa_switch *ds, int port, static int lan9303_port_mdb_del(struct dsa_switch *ds, int port,
...@@ -1274,7 +1279,6 @@ static const struct dsa_switch_ops lan9303_switch_ops = { ...@@ -1274,7 +1279,6 @@ static const struct dsa_switch_ops lan9303_switch_ops = {
.port_fdb_add = lan9303_port_fdb_add, .port_fdb_add = lan9303_port_fdb_add,
.port_fdb_del = lan9303_port_fdb_del, .port_fdb_del = lan9303_port_fdb_del,
.port_fdb_dump = lan9303_port_fdb_dump, .port_fdb_dump = lan9303_port_fdb_dump,
.port_mdb_prepare = lan9303_port_mdb_prepare,
.port_mdb_add = lan9303_port_mdb_add, .port_mdb_add = lan9303_port_mdb_add,
.port_mdb_del = lan9303_port_mdb_del, .port_mdb_del = lan9303_port_mdb_del,
}; };
......
...@@ -1114,7 +1114,6 @@ static const struct dsa_switch_ops ksz8795_switch_ops = { ...@@ -1114,7 +1114,6 @@ static const struct dsa_switch_ops ksz8795_switch_ops = {
.port_vlan_add = ksz8795_port_vlan_add, .port_vlan_add = ksz8795_port_vlan_add,
.port_vlan_del = ksz8795_port_vlan_del, .port_vlan_del = ksz8795_port_vlan_del,
.port_fdb_dump = ksz_port_fdb_dump, .port_fdb_dump = ksz_port_fdb_dump,
.port_mdb_prepare = ksz_port_mdb_prepare,
.port_mdb_add = ksz_port_mdb_add, .port_mdb_add = ksz_port_mdb_add,
.port_mdb_del = ksz_port_mdb_del, .port_mdb_del = ksz_port_mdb_del,
.port_mirror_add = ksz8795_port_mirror_add, .port_mirror_add = ksz8795_port_mirror_add,
......
...@@ -774,14 +774,15 @@ static int ksz9477_port_fdb_dump(struct dsa_switch *ds, int port, ...@@ -774,14 +774,15 @@ static int ksz9477_port_fdb_dump(struct dsa_switch *ds, int port,
return ret; return ret;
} }
static void ksz9477_port_mdb_add(struct dsa_switch *ds, int port, static int ksz9477_port_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb) const struct switchdev_obj_port_mdb *mdb)
{ {
struct ksz_device *dev = ds->priv; struct ksz_device *dev = ds->priv;
u32 static_table[4]; u32 static_table[4];
u32 data; u32 data;
int index; int index;
u32 mac_hi, mac_lo; u32 mac_hi, mac_lo;
int err = 0;
mac_hi = ((mdb->addr[0] << 8) | mdb->addr[1]); mac_hi = ((mdb->addr[0] << 8) | mdb->addr[1]);
mac_lo = ((mdb->addr[2] << 24) | (mdb->addr[3] << 16)); mac_lo = ((mdb->addr[2] << 24) | (mdb->addr[3] << 16));
...@@ -796,7 +797,8 @@ static void ksz9477_port_mdb_add(struct dsa_switch *ds, int port, ...@@ -796,7 +797,8 @@ static void ksz9477_port_mdb_add(struct dsa_switch *ds, int port,
ksz_write32(dev, REG_SW_ALU_STAT_CTRL__4, data); ksz_write32(dev, REG_SW_ALU_STAT_CTRL__4, data);
/* wait to be finished */ /* wait to be finished */
if (ksz9477_wait_alu_sta_ready(dev)) { err = ksz9477_wait_alu_sta_ready(dev);
if (err) {
dev_dbg(dev->dev, "Failed to read ALU STATIC\n"); dev_dbg(dev->dev, "Failed to read ALU STATIC\n");
goto exit; goto exit;
} }
...@@ -819,8 +821,10 @@ static void ksz9477_port_mdb_add(struct dsa_switch *ds, int port, ...@@ -819,8 +821,10 @@ static void ksz9477_port_mdb_add(struct dsa_switch *ds, int port,
} }
/* no available entry */ /* no available entry */
if (index == dev->num_statics) if (index == dev->num_statics) {
err = -ENOSPC;
goto exit; goto exit;
}
/* add entry */ /* add entry */
static_table[0] = ALU_V_STATIC_VALID; static_table[0] = ALU_V_STATIC_VALID;
...@@ -842,6 +846,7 @@ static void ksz9477_port_mdb_add(struct dsa_switch *ds, int port, ...@@ -842,6 +846,7 @@ static void ksz9477_port_mdb_add(struct dsa_switch *ds, int port,
exit: exit:
mutex_unlock(&dev->alu_mutex); mutex_unlock(&dev->alu_mutex);
return err;
} }
static int ksz9477_port_mdb_del(struct dsa_switch *ds, int port, static int ksz9477_port_mdb_del(struct dsa_switch *ds, int port,
...@@ -1395,7 +1400,6 @@ static const struct dsa_switch_ops ksz9477_switch_ops = { ...@@ -1395,7 +1400,6 @@ static const struct dsa_switch_ops ksz9477_switch_ops = {
.port_fdb_dump = ksz9477_port_fdb_dump, .port_fdb_dump = ksz9477_port_fdb_dump,
.port_fdb_add = ksz9477_port_fdb_add, .port_fdb_add = ksz9477_port_fdb_add,
.port_fdb_del = ksz9477_port_fdb_del, .port_fdb_del = ksz9477_port_fdb_del,
.port_mdb_prepare = ksz_port_mdb_prepare,
.port_mdb_add = ksz9477_port_mdb_add, .port_mdb_add = ksz9477_port_mdb_add,
.port_mdb_del = ksz9477_port_mdb_del, .port_mdb_del = ksz9477_port_mdb_del,
.port_mirror_add = ksz9477_port_mirror_add, .port_mirror_add = ksz9477_port_mirror_add,
......
...@@ -253,16 +253,8 @@ int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb, ...@@ -253,16 +253,8 @@ int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb,
} }
EXPORT_SYMBOL_GPL(ksz_port_fdb_dump); EXPORT_SYMBOL_GPL(ksz_port_fdb_dump);
int ksz_port_mdb_prepare(struct dsa_switch *ds, int port, int ksz_port_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb) const struct switchdev_obj_port_mdb *mdb)
{
/* nothing to do */
return 0;
}
EXPORT_SYMBOL_GPL(ksz_port_mdb_prepare);
void ksz_port_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb)
{ {
struct ksz_device *dev = ds->priv; struct ksz_device *dev = ds->priv;
struct alu_struct alu; struct alu_struct alu;
...@@ -284,7 +276,7 @@ void ksz_port_mdb_add(struct dsa_switch *ds, int port, ...@@ -284,7 +276,7 @@ void ksz_port_mdb_add(struct dsa_switch *ds, int port,
/* no available entry */ /* no available entry */
if (index == dev->num_statics && !empty) if (index == dev->num_statics && !empty)
return; return -ENOSPC;
/* add entry */ /* add entry */
if (index == dev->num_statics) { if (index == dev->num_statics) {
...@@ -301,6 +293,8 @@ void ksz_port_mdb_add(struct dsa_switch *ds, int port, ...@@ -301,6 +293,8 @@ void ksz_port_mdb_add(struct dsa_switch *ds, int port,
alu.fid = mdb->vid; alu.fid = mdb->vid;
} }
dev->dev_ops->w_sta_mac_table(dev, index, &alu); dev->dev_ops->w_sta_mac_table(dev, index, &alu);
return 0;
} }
EXPORT_SYMBOL_GPL(ksz_port_mdb_add); EXPORT_SYMBOL_GPL(ksz_port_mdb_add);
......
...@@ -165,10 +165,8 @@ int ksz_port_vlan_prepare(struct dsa_switch *ds, int port, ...@@ -165,10 +165,8 @@ int ksz_port_vlan_prepare(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_vlan *vlan); const struct switchdev_obj_port_vlan *vlan);
int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb, int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb,
void *data); void *data);
int ksz_port_mdb_prepare(struct dsa_switch *ds, int port, int ksz_port_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb); const struct switchdev_obj_port_mdb *mdb);
void ksz_port_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb);
int ksz_port_mdb_del(struct dsa_switch *ds, int port, int ksz_port_mdb_del(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb); const struct switchdev_obj_port_mdb *mdb);
int ksz_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy); int ksz_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy);
......
...@@ -5238,27 +5238,18 @@ static enum dsa_tag_protocol mv88e6xxx_get_tag_protocol(struct dsa_switch *ds, ...@@ -5238,27 +5238,18 @@ static enum dsa_tag_protocol mv88e6xxx_get_tag_protocol(struct dsa_switch *ds,
return chip->info->tag_protocol; return chip->info->tag_protocol;
} }
static int mv88e6xxx_port_mdb_prepare(struct dsa_switch *ds, int port, static int mv88e6xxx_port_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb) const struct switchdev_obj_port_mdb *mdb)
{
/* We don't need any dynamic resource from the kernel (yet),
* so skip the prepare phase.
*/
return 0;
}
static void mv88e6xxx_port_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb)
{ {
struct mv88e6xxx_chip *chip = ds->priv; struct mv88e6xxx_chip *chip = ds->priv;
int err;
mv88e6xxx_reg_lock(chip); mv88e6xxx_reg_lock(chip);
if (mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid, err = mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid,
MV88E6XXX_G1_ATU_DATA_STATE_MC_STATIC)) MV88E6XXX_G1_ATU_DATA_STATE_MC_STATIC);
dev_err(ds->dev, "p%d: failed to load multicast MAC address\n",
port);
mv88e6xxx_reg_unlock(chip); mv88e6xxx_reg_unlock(chip);
return err;
} }
static int mv88e6xxx_port_mdb_del(struct dsa_switch *ds, int port, static int mv88e6xxx_port_mdb_del(struct dsa_switch *ds, int port,
...@@ -5403,7 +5394,6 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = { ...@@ -5403,7 +5394,6 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = {
.port_fdb_add = mv88e6xxx_port_fdb_add, .port_fdb_add = mv88e6xxx_port_fdb_add,
.port_fdb_del = mv88e6xxx_port_fdb_del, .port_fdb_del = mv88e6xxx_port_fdb_del,
.port_fdb_dump = mv88e6xxx_port_fdb_dump, .port_fdb_dump = mv88e6xxx_port_fdb_dump,
.port_mdb_prepare = mv88e6xxx_port_mdb_prepare,
.port_mdb_add = mv88e6xxx_port_mdb_add, .port_mdb_add = mv88e6xxx_port_mdb_add,
.port_mdb_del = mv88e6xxx_port_mdb_del, .port_mdb_del = mv88e6xxx_port_mdb_del,
.port_mirror_add = mv88e6xxx_port_mirror_add, .port_mirror_add = mv88e6xxx_port_mirror_add,
......
...@@ -65,19 +65,12 @@ static int felix_fdb_del(struct dsa_switch *ds, int port, ...@@ -65,19 +65,12 @@ static int felix_fdb_del(struct dsa_switch *ds, int port,
return ocelot_fdb_del(ocelot, port, addr, vid); return ocelot_fdb_del(ocelot, port, addr, vid);
} }
/* This callback needs to be present */ static int felix_mdb_add(struct dsa_switch *ds, int port,
static int felix_mdb_prepare(struct dsa_switch *ds, int port, const struct switchdev_obj_port_mdb *mdb)
const struct switchdev_obj_port_mdb *mdb)
{
return 0;
}
static void felix_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb)
{ {
struct ocelot *ocelot = ds->priv; struct ocelot *ocelot = ds->priv;
ocelot_port_mdb_add(ocelot, port, mdb); return ocelot_port_mdb_add(ocelot, port, mdb);
} }
static int felix_mdb_del(struct dsa_switch *ds, int port, static int felix_mdb_del(struct dsa_switch *ds, int port,
...@@ -772,7 +765,6 @@ const struct dsa_switch_ops felix_switch_ops = { ...@@ -772,7 +765,6 @@ const struct dsa_switch_ops felix_switch_ops = {
.port_fdb_dump = felix_fdb_dump, .port_fdb_dump = felix_fdb_dump,
.port_fdb_add = felix_fdb_add, .port_fdb_add = felix_fdb_add,
.port_fdb_del = felix_fdb_del, .port_fdb_del = felix_fdb_del,
.port_mdb_prepare = felix_mdb_prepare,
.port_mdb_add = felix_mdb_add, .port_mdb_add = felix_mdb_add,
.port_mdb_del = felix_mdb_del, .port_mdb_del = felix_mdb_del,
.port_bridge_join = felix_bridge_join, .port_bridge_join = felix_bridge_join,
......
...@@ -1524,17 +1524,10 @@ static int sja1105_fdb_dump(struct dsa_switch *ds, int port, ...@@ -1524,17 +1524,10 @@ static int sja1105_fdb_dump(struct dsa_switch *ds, int port,
return 0; return 0;
} }
/* This callback needs to be present */ static int sja1105_mdb_add(struct dsa_switch *ds, int port,
static int sja1105_mdb_prepare(struct dsa_switch *ds, int port, const struct switchdev_obj_port_mdb *mdb)
const struct switchdev_obj_port_mdb *mdb)
{
return 0;
}
static void sja1105_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb)
{ {
sja1105_fdb_add(ds, port, mdb->addr, mdb->vid); return sja1105_fdb_add(ds, port, mdb->addr, mdb->vid);
} }
static int sja1105_mdb_del(struct dsa_switch *ds, int port, static int sja1105_mdb_del(struct dsa_switch *ds, int port,
...@@ -3288,7 +3281,6 @@ static const struct dsa_switch_ops sja1105_switch_ops = { ...@@ -3288,7 +3281,6 @@ static const struct dsa_switch_ops sja1105_switch_ops = {
.port_vlan_filtering = sja1105_vlan_filtering, .port_vlan_filtering = sja1105_vlan_filtering,
.port_vlan_add = sja1105_vlan_add, .port_vlan_add = sja1105_vlan_add,
.port_vlan_del = sja1105_vlan_del, .port_vlan_del = sja1105_vlan_del,
.port_mdb_prepare = sja1105_mdb_prepare,
.port_mdb_add = sja1105_mdb_add, .port_mdb_add = sja1105_mdb_add,
.port_mdb_del = sja1105_mdb_del, .port_mdb_del = sja1105_mdb_del,
.port_hwtstamp_get = sja1105_hwtstamp_get, .port_hwtstamp_get = sja1105_hwtstamp_get,
......
...@@ -585,10 +585,8 @@ struct dsa_switch_ops { ...@@ -585,10 +585,8 @@ struct dsa_switch_ops {
/* /*
* Multicast database * Multicast database
*/ */
int (*port_mdb_prepare)(struct dsa_switch *ds, int port, int (*port_mdb_add)(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb); const struct switchdev_obj_port_mdb *mdb);
void (*port_mdb_add)(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb);
int (*port_mdb_del)(struct dsa_switch *ds, int port, int (*port_mdb_del)(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb); const struct switchdev_obj_port_mdb *mdb);
/* /*
......
...@@ -181,24 +181,21 @@ static bool dsa_switch_mdb_match(struct dsa_switch *ds, int port, ...@@ -181,24 +181,21 @@ static bool dsa_switch_mdb_match(struct dsa_switch *ds, int port,
static int dsa_switch_mdb_add(struct dsa_switch *ds, static int dsa_switch_mdb_add(struct dsa_switch *ds,
struct dsa_notifier_mdb_info *info) struct dsa_notifier_mdb_info *info)
{ {
int port, err; int err = 0;
int port;
if (!ds->ops->port_mdb_prepare || !ds->ops->port_mdb_add) if (!ds->ops->port_mdb_add)
return -EOPNOTSUPP; return -EOPNOTSUPP;
for (port = 0; port < ds->num_ports; port++) { for (port = 0; port < ds->num_ports; port++) {
if (dsa_switch_mdb_match(ds, port, info)) { if (dsa_switch_mdb_match(ds, port, info)) {
err = ds->ops->port_mdb_prepare(ds, port, info->mdb); err = ds->ops->port_mdb_add(ds, port, info->mdb);
if (err) if (err)
return err; break;
} }
} }
for (port = 0; port < ds->num_ports; port++) return err;
if (dsa_switch_mdb_match(ds, port, info))
ds->ops->port_mdb_add(ds, port, info->mdb);
return 0;
} }
static int dsa_switch_mdb_del(struct dsa_switch *ds, static int dsa_switch_mdb_del(struct dsa_switch *ds,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment