]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
net: dsa: remove the transactional logic from MDB entries
authorVladimir Oltean <vladimir.oltean@nxp.com>
Sat, 9 Jan 2021 00:01:52 +0000 (02:01 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 12 Jan 2021 00:00:57 +0000 (16:00 -0800)
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: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Kurt Kanzenbach <kurt@linutronix.de> # hellcreek
Reviewed-by: Linus Wallei <linus.walleij@linaro.org> # RTL8366
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
13 files changed:
drivers/net/dsa/b53/b53_common.c
drivers/net/dsa/b53/b53_priv.h
drivers/net/dsa/bcm_sf2.c
drivers/net/dsa/lan9303-core.c
drivers/net/dsa/microchip/ksz8795.c
drivers/net/dsa/microchip/ksz9477.c
drivers/net/dsa/microchip/ksz_common.c
drivers/net/dsa/microchip/ksz_common.h
drivers/net/dsa/mv88e6xxx/chip.c
drivers/net/dsa/ocelot/felix.c
drivers/net/dsa/sja1105/sja1105_main.c
include/net/dsa.h
net/dsa/switch.c

index f07f547db53e347988f926af2296a80c0d19db09..d5f2798968edf6894746fabc3e8e6eda4403daf2 100644 (file)
@@ -1741,8 +1741,8 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,
 }
 EXPORT_SYMBOL(b53_fdb_dump);
 
-int b53_mdb_prepare(struct dsa_switch *ds, int port,
-                   const struct switchdev_obj_port_mdb *mdb)
+int b53_mdb_add(struct dsa_switch *ds, int port,
+               const struct switchdev_obj_port_mdb *mdb)
 {
        struct b53_device *priv = ds->priv;
 
@@ -1752,19 +1752,7 @@ int b53_mdb_prepare(struct dsa_switch *ds, int port,
        if (is5325(priv) || is5365(priv))
                return -EOPNOTSUPP;
 
-       return 0;
-}
-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");
+       return b53_arl_op(priv, 0, port, mdb->addr, mdb->vid, true);
 }
 EXPORT_SYMBOL(b53_mdb_add);
 
@@ -2205,7 +2193,6 @@ static const struct dsa_switch_ops b53_switch_ops = {
        .port_fdb_del           = b53_fdb_del,
        .port_mirror_add        = b53_mirror_add,
        .port_mirror_del        = b53_mirror_del,
-       .port_mdb_prepare       = b53_mdb_prepare,
        .port_mdb_add           = b53_mdb_add,
        .port_mdb_del           = b53_mdb_del,
        .port_max_mtu           = b53_get_max_mtu,
index 9ab0fb409f78a8dd6cb98c8068a0bf52269c514a..2a4a54df3a312f804e2497b4094c6f9279309427 100644 (file)
@@ -361,10 +361,8 @@ int b53_fdb_del(struct dsa_switch *ds, int port,
                const unsigned char *addr, u16 vid);
 int b53_fdb_dump(struct dsa_switch *ds, int port,
                 dsa_fdb_dump_cb_t *cb, void *data);
-int b53_mdb_prepare(struct dsa_switch *ds, int port,
-                   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_add(struct dsa_switch *ds, int port,
+               const struct switchdev_obj_port_mdb *mdb);
 int b53_mdb_del(struct dsa_switch *ds, int port,
                const struct switchdev_obj_port_mdb *mdb);
 int b53_mirror_add(struct dsa_switch *ds, int port,
index 65c8a044f222a9a011c20cc3412e7be45aaa7bf6..12ff84109f1337886300952a74e0594564a57a4c 100644 (file)
@@ -1126,7 +1126,6 @@ static const struct dsa_switch_ops bcm_sf2_ops = {
        .set_rxnfc              = bcm_sf2_set_rxnfc,
        .port_mirror_add        = b53_mirror_add,
        .port_mirror_del        = b53_mirror_del,
-       .port_mdb_prepare       = b53_mdb_prepare,
        .port_mdb_add           = b53_mdb_add,
        .port_mdb_del           = b53_mdb_del,
 };
index aa1142d6a9f5485b9e97ea004a4824089430320b..34437402542611db4cdf94e29e04599d99236b8a 100644 (file)
@@ -1232,14 +1232,19 @@ static int lan9303_port_mdb_prepare(struct dsa_switch *ds, int port,
        return 0;
 }
 
-static void lan9303_port_mdb_add(struct dsa_switch *ds, int port,
-                                const struct switchdev_obj_port_mdb *mdb)
+static int lan9303_port_mdb_add(struct dsa_switch *ds, int port,
+                               const struct switchdev_obj_port_mdb *mdb)
 {
        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,
                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,
@@ -1274,7 +1279,6 @@ static const struct dsa_switch_ops lan9303_switch_ops = {
        .port_fdb_add           = lan9303_port_fdb_add,
        .port_fdb_del           = lan9303_port_fdb_del,
        .port_fdb_dump          = lan9303_port_fdb_dump,
-       .port_mdb_prepare       = lan9303_port_mdb_prepare,
        .port_mdb_add           = lan9303_port_mdb_add,
        .port_mdb_del           = lan9303_port_mdb_del,
 };
index 6a9ec8a0f92f821e241a7dcf7e255121a876f749..89e1c01cf5b8831465531495131ad2cedde2eced 100644 (file)
@@ -1114,7 +1114,6 @@ static const struct dsa_switch_ops ksz8795_switch_ops = {
        .port_vlan_add          = ksz8795_port_vlan_add,
        .port_vlan_del          = ksz8795_port_vlan_del,
        .port_fdb_dump          = ksz_port_fdb_dump,
-       .port_mdb_prepare       = ksz_port_mdb_prepare,
        .port_mdb_add           = ksz_port_mdb_add,
        .port_mdb_del           = ksz_port_mdb_del,
        .port_mirror_add        = ksz8795_port_mirror_add,
index 446c088ce5c56d935b1061f480b1046b79927874..08bf54eb9f5f0abd6cb93f342d6862c9f7b5ea80 100644 (file)
@@ -774,14 +774,15 @@ exit:
        return ret;
 }
 
-static void ksz9477_port_mdb_add(struct dsa_switch *ds, int port,
-                                const struct switchdev_obj_port_mdb *mdb)
+static int ksz9477_port_mdb_add(struct dsa_switch *ds, int port,
+                               const struct switchdev_obj_port_mdb *mdb)
 {
        struct ksz_device *dev = ds->priv;
        u32 static_table[4];
        u32 data;
        int index;
        u32 mac_hi, mac_lo;
+       int err = 0;
 
        mac_hi = ((mdb->addr[0] << 8) | mdb->addr[1]);
        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,
                ksz_write32(dev, REG_SW_ALU_STAT_CTRL__4, data);
 
                /* 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");
                        goto exit;
                }
@@ -819,8 +821,10 @@ static void ksz9477_port_mdb_add(struct dsa_switch *ds, int port,
        }
 
        /* no available entry */
-       if (index == dev->num_statics)
+       if (index == dev->num_statics) {
+               err = -ENOSPC;
                goto exit;
+       }
 
        /* add entry */
        static_table[0] = ALU_V_STATIC_VALID;
@@ -842,6 +846,7 @@ static void ksz9477_port_mdb_add(struct dsa_switch *ds, int port,
 
 exit:
        mutex_unlock(&dev->alu_mutex);
+       return err;
 }
 
 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 = {
        .port_fdb_dump          = ksz9477_port_fdb_dump,
        .port_fdb_add           = ksz9477_port_fdb_add,
        .port_fdb_del           = ksz9477_port_fdb_del,
-       .port_mdb_prepare       = ksz_port_mdb_prepare,
        .port_mdb_add           = ksz9477_port_mdb_add,
        .port_mdb_del           = ksz9477_port_mdb_del,
        .port_mirror_add        = ksz9477_port_mirror_add,
index cf743133b0b93a0af95b0fa25b368def9184840e..f2c9ff3ea4bef6f4ab4769e574e10a5cafcef3b7 100644 (file)
@@ -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);
 
-int ksz_port_mdb_prepare(struct dsa_switch *ds, int port,
-                        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)
+int ksz_port_mdb_add(struct dsa_switch *ds, int port,
+                    const struct switchdev_obj_port_mdb *mdb)
 {
        struct ksz_device *dev = ds->priv;
        struct alu_struct alu;
@@ -284,7 +276,7 @@ void ksz_port_mdb_add(struct dsa_switch *ds, int port,
 
        /* no available entry */
        if (index == dev->num_statics && !empty)
-               return;
+               return -ENOSPC;
 
        /* add entry */
        if (index == dev->num_statics) {
@@ -301,6 +293,8 @@ void ksz_port_mdb_add(struct dsa_switch *ds, int port,
                alu.fid = mdb->vid;
        }
        dev->dev_ops->w_sta_mac_table(dev, index, &alu);
+
+       return 0;
 }
 EXPORT_SYMBOL_GPL(ksz_port_mdb_add);
 
index 720f22275c844488e5953974492a6d381b9edc95..a1f0929d45a05af544db69349ee677a319a4c7c3 100644 (file)
@@ -165,10 +165,8 @@ int ksz_port_vlan_prepare(struct dsa_switch *ds, int port,
                          const struct switchdev_obj_port_vlan *vlan);
 int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb,
                      void *data);
-int ksz_port_mdb_prepare(struct dsa_switch *ds, int port,
-                        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_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,
                     const struct switchdev_obj_port_mdb *mdb);
 int ksz_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy);
index bbf1a71ce55cfb669a5bf3285435f1c84aeb50a1..e9c517c0f89c3ac36cd9f0ac55ef419f39823746 100644 (file)
@@ -5238,27 +5238,18 @@ static enum dsa_tag_protocol mv88e6xxx_get_tag_protocol(struct dsa_switch *ds,
        return chip->info->tag_protocol;
 }
 
-static int mv88e6xxx_port_mdb_prepare(struct dsa_switch *ds, int port,
-                                     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)
+static int mv88e6xxx_port_mdb_add(struct dsa_switch *ds, int port,
+                                 const struct switchdev_obj_port_mdb *mdb)
 {
        struct mv88e6xxx_chip *chip = ds->priv;
+       int err;
 
        mv88e6xxx_reg_lock(chip);
-       if (mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid,
-                                        MV88E6XXX_G1_ATU_DATA_STATE_MC_STATIC))
-               dev_err(ds->dev, "p%d: failed to load multicast MAC address\n",
-                       port);
+       err = mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid,
+                                          MV88E6XXX_G1_ATU_DATA_STATE_MC_STATIC);
        mv88e6xxx_reg_unlock(chip);
+
+       return err;
 }
 
 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 = {
        .port_fdb_add           = mv88e6xxx_port_fdb_add,
        .port_fdb_del           = mv88e6xxx_port_fdb_del,
        .port_fdb_dump          = mv88e6xxx_port_fdb_dump,
-       .port_mdb_prepare       = mv88e6xxx_port_mdb_prepare,
        .port_mdb_add           = mv88e6xxx_port_mdb_add,
        .port_mdb_del           = mv88e6xxx_port_mdb_del,
        .port_mirror_add        = mv88e6xxx_port_mirror_add,
index 8c4cd9168dbaffa672349e81b6ddf605f207bed7..2825dd11feeea335252b3291ea380a44279dfbce 100644 (file)
@@ -65,19 +65,12 @@ static int felix_fdb_del(struct dsa_switch *ds, int port,
        return ocelot_fdb_del(ocelot, port, addr, vid);
 }
 
-/* This callback needs to be present */
-static int felix_mdb_prepare(struct dsa_switch *ds, int port,
-                            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)
+static int felix_mdb_add(struct dsa_switch *ds, int port,
+                        const struct switchdev_obj_port_mdb *mdb)
 {
        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,
@@ -772,7 +765,6 @@ const struct dsa_switch_ops felix_switch_ops = {
        .port_fdb_dump          = felix_fdb_dump,
        .port_fdb_add           = felix_fdb_add,
        .port_fdb_del           = felix_fdb_del,
-       .port_mdb_prepare       = felix_mdb_prepare,
        .port_mdb_add           = felix_mdb_add,
        .port_mdb_del           = felix_mdb_del,
        .port_bridge_join       = felix_bridge_join,
index c1b7f2b0e40cbff1e565cd846ed2d84ada76511f..be200d4289af72f033cb036ca405b13f2a64555b 100644 (file)
@@ -1524,17 +1524,10 @@ static int sja1105_fdb_dump(struct dsa_switch *ds, int port,
        return 0;
 }
 
-/* This callback needs to be present */
-static int sja1105_mdb_prepare(struct dsa_switch *ds, int port,
-                              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)
+static int 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,
@@ -3288,7 +3281,6 @@ static const struct dsa_switch_ops sja1105_switch_ops = {
        .port_vlan_filtering    = sja1105_vlan_filtering,
        .port_vlan_add          = sja1105_vlan_add,
        .port_vlan_del          = sja1105_vlan_del,
-       .port_mdb_prepare       = sja1105_mdb_prepare,
        .port_mdb_add           = sja1105_mdb_add,
        .port_mdb_del           = sja1105_mdb_del,
        .port_hwtstamp_get      = sja1105_hwtstamp_get,
index d0f0430919698548e30401b16e0db9f86be1883f..b8c0550dfa74683cde4feef477970d85e6ef2e17 100644 (file)
@@ -585,10 +585,8 @@ struct dsa_switch_ops {
        /*
         * 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);
-       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,
                                const struct switchdev_obj_port_mdb *mdb);
        /*
index c6b3ac93bcc74f84986d9a9ae762745ae013889d..5f5e19c5e43ae562cfc16ebe167f0ac5bcef9c3e 100644 (file)
@@ -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,
                              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;
 
        for (port = 0; port < ds->num_ports; port++) {
                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)
-                               return err;
+                               break;
                }
        }
 
-       for (port = 0; port < ds->num_ports; port++)
-               if (dsa_switch_mdb_match(ds, port, info))
-                       ds->ops->port_mdb_add(ds, port, info->mdb);
-
-       return 0;
+       return err;
 }
 
 static int dsa_switch_mdb_del(struct dsa_switch *ds,