net: dsa: add cross-chip bridging operations
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>
Thu, 30 Mar 2017 21:37:14 +0000 (17:37 -0400)
committerDavid S. Miller <davem@davemloft.net>
Sat, 1 Apr 2017 19:22:57 +0000 (12:22 -0700)
Introduce crosschip_bridge_{join,leave} operations in the dsa_switch_ops
structure, which can be used by switches supporting interconnection.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dsa.h
net/dsa/switch.c

index 951b5e49e8991913394923e255c2232acdaecb02..ffe56cc338feb9618191bdfcee44201d8139c72d 100644 (file)
@@ -456,6 +456,14 @@ struct dsa_switch_ops {
                                   bool ingress);
        void    (*port_mirror_del)(struct dsa_switch *ds, int port,
                                   struct dsa_mall_mirror_tc_entry *mirror);
+
+       /*
+        * Cross-chip operations
+        */
+       int     (*crosschip_bridge_join)(struct dsa_switch *ds, int sw_index,
+                                        int port, struct net_device *br);
+       void    (*crosschip_bridge_leave)(struct dsa_switch *ds, int sw_index,
+                                         int port, struct net_device *br);
 };
 
 struct dsa_switch_driver {
index 7b6f38e5fef6195331086b437b3f7395fa2c3481..ca6e26e514f089cfa8991ef6a7bd790bd8db14fe 100644 (file)
@@ -20,9 +20,9 @@ static int dsa_switch_bridge_join(struct dsa_switch *ds,
        if (ds->index == info->sw_index && ds->ops->port_bridge_join)
                return ds->ops->port_bridge_join(ds, info->port, info->br);
 
-       if (ds->index != info->sw_index)
-               dev_dbg(ds->dev, "crosschip DSA port %d.%d bridged to %s\n",
-                       info->sw_index, info->port, netdev_name(info->br));
+       if (ds->index != info->sw_index && ds->ops->crosschip_bridge_join)
+               return ds->ops->crosschip_bridge_join(ds, info->sw_index,
+                                                     info->port, info->br);
 
        return 0;
 }
@@ -33,9 +33,9 @@ static int dsa_switch_bridge_leave(struct dsa_switch *ds,
        if (ds->index == info->sw_index && ds->ops->port_bridge_leave)
                ds->ops->port_bridge_leave(ds, info->port, info->br);
 
-       if (ds->index != info->sw_index)
-               dev_dbg(ds->dev, "crosschip DSA port %d.%d unbridged from %s\n",
-                       info->sw_index, info->port, netdev_name(info->br));
+       if (ds->index != info->sw_index && ds->ops->crosschip_bridge_leave)
+               ds->ops->crosschip_bridge_leave(ds, info->sw_index, info->port,
+                                               info->br);
 
        return 0;
 }