]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net: dsa: remove cross-chip support for HSR
authorVladimir Oltean <vladimir.oltean@nxp.com>
Wed, 5 Jan 2022 13:18:13 +0000 (15:18 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 5 Jan 2022 15:04:51 +0000 (15:04 +0000)
The cross-chip notifiers for HSR are bypass operations, meaning that
even though all switches in a tree are notified, only the switch
specified in the info structure is targeted.

We can eliminate the unnecessary complexity by deleting the cross-chip
notifier logic and calling the ds->ops straight from port.c.

Cc: George McCollister <george.mccollister@gmail.com>
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: George McCollister <george.mccollister@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/dsa/dsa_priv.h
net/dsa/port.c
net/dsa/switch.c

index c593d56c94b3b47c9e402dcd6297fd069e304fc7..760306f0012fde416556227717965b44269279b1 100644 (file)
@@ -25,8 +25,6 @@ enum {
        DSA_NOTIFIER_FDB_DEL,
        DSA_NOTIFIER_HOST_FDB_ADD,
        DSA_NOTIFIER_HOST_FDB_DEL,
-       DSA_NOTIFIER_HSR_JOIN,
-       DSA_NOTIFIER_HSR_LEAVE,
        DSA_NOTIFIER_LAG_CHANGE,
        DSA_NOTIFIER_LAG_JOIN,
        DSA_NOTIFIER_LAG_LEAVE,
@@ -125,13 +123,6 @@ struct dsa_switchdev_event_work {
        bool host_addr;
 };
 
-/* DSA_NOTIFIER_HSR_* */
-struct dsa_notifier_hsr_info {
-       struct net_device *hsr;
-       int sw_index;
-       int port;
-};
-
 struct dsa_slave_priv {
        /* Copy of CPU port xmit for faster access in slave transmit hot path */
        struct sk_buff *        (*xmit)(struct sk_buff *skb,
index 05be4577b044194f642bda7e3035424da663fefd..bd78192e0e47d6b7ff3cccc9038556e8976a714a 100644 (file)
@@ -1317,16 +1317,15 @@ EXPORT_SYMBOL_GPL(dsa_port_get_phy_sset_count);
 
 int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr)
 {
-       struct dsa_notifier_hsr_info info = {
-               .sw_index = dp->ds->index,
-               .port = dp->index,
-               .hsr = hsr,
-       };
+       struct dsa_switch *ds = dp->ds;
        int err;
 
+       if (!ds->ops->port_hsr_join)
+               return -EOPNOTSUPP;
+
        dp->hsr_dev = hsr;
 
-       err = dsa_port_notify(dp, DSA_NOTIFIER_HSR_JOIN, &info);
+       err = ds->ops->port_hsr_join(ds, dp->index, hsr);
        if (err)
                dp->hsr_dev = NULL;
 
@@ -1335,20 +1334,18 @@ int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr)
 
 void dsa_port_hsr_leave(struct dsa_port *dp, struct net_device *hsr)
 {
-       struct dsa_notifier_hsr_info info = {
-               .sw_index = dp->ds->index,
-               .port = dp->index,
-               .hsr = hsr,
-       };
+       struct dsa_switch *ds = dp->ds;
        int err;
 
        dp->hsr_dev = NULL;
 
-       err = dsa_port_notify(dp, DSA_NOTIFIER_HSR_LEAVE, &info);
-       if (err)
-               dev_err(dp->ds->dev,
-                       "port %d failed to notify DSA_NOTIFIER_HSR_LEAVE: %pe\n",
-                       dp->index, ERR_PTR(err));
+       if (ds->ops->port_hsr_leave) {
+               err = ds->ops->port_hsr_leave(ds, dp->index, hsr);
+               if (err)
+                       dev_err(dp->ds->dev,
+                               "port %d failed to leave HSR %s: %pe\n",
+                               dp->index, hsr->name, ERR_PTR(err));
+       }
 }
 
 int dsa_port_tag_8021q_vlan_add(struct dsa_port *dp, u16 vid, bool broadcast)
index a164ec02b4e96c456991196874ee46b0b24bf499..e3c7d2627a619344fc2faef4875628684f6a6c76 100644 (file)
@@ -437,24 +437,6 @@ static int dsa_switch_fdb_del(struct dsa_switch *ds,
        return dsa_port_do_fdb_del(dp, info->addr, info->vid);
 }
 
-static int dsa_switch_hsr_join(struct dsa_switch *ds,
-                              struct dsa_notifier_hsr_info *info)
-{
-       if (ds->index == info->sw_index && ds->ops->port_hsr_join)
-               return ds->ops->port_hsr_join(ds, info->port, info->hsr);
-
-       return -EOPNOTSUPP;
-}
-
-static int dsa_switch_hsr_leave(struct dsa_switch *ds,
-                               struct dsa_notifier_hsr_info *info)
-{
-       if (ds->index == info->sw_index && ds->ops->port_hsr_leave)
-               return ds->ops->port_hsr_leave(ds, info->port, info->hsr);
-
-       return -EOPNOTSUPP;
-}
-
 static int dsa_switch_lag_change(struct dsa_switch *ds,
                                 struct dsa_notifier_lag_info *info)
 {
@@ -729,12 +711,6 @@ static int dsa_switch_event(struct notifier_block *nb,
        case DSA_NOTIFIER_HOST_FDB_DEL:
                err = dsa_switch_host_fdb_del(ds, info);
                break;
-       case DSA_NOTIFIER_HSR_JOIN:
-               err = dsa_switch_hsr_join(ds, info);
-               break;
-       case DSA_NOTIFIER_HSR_LEAVE:
-               err = dsa_switch_hsr_leave(ds, info);
-               break;
        case DSA_NOTIFIER_LAG_CHANGE:
                err = dsa_switch_lag_change(ds, info);
                break;