]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net: dsa: Add helper to resolve bridge port from DSA port
authorTobias Waldekranz <tobias@waldekranz.com>
Thu, 18 Mar 2021 19:25:33 +0000 (20:25 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 18 Mar 2021 23:24:06 +0000 (16:24 -0700)
In order for a driver to be able to query a bridge for information
about itself, e.g. reading out port flags, it has to use a netdev that
is known to the bridge. In the simple case, that is just the netdev
representing the port, e.g. swp0 or swp1 in this example:

   br0
   / \
swp0 swp1

But in the case of an offloaded lag, this will be the bond or team
interface, e.g. bond0 in this example:

     br0
     /
  bond0
   / \
swp0 swp1

Add a helper that hides some of this complexity from the
drivers. Then, redefine dsa_port_offloads_bridge_port using the helper
to avoid double accounting of the set of possible offloaded uppers.

Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dsa.h
net/dsa/dsa_priv.h

index dac303edd33df2c5a56f9dce09b6f79b6c7f0a65..57b2c49f72f4620b70221212345ddbbf38e19542 100644 (file)
@@ -493,6 +493,20 @@ static inline bool dsa_port_is_vlan_filtering(const struct dsa_port *dp)
                return dp->vlan_filtering;
 }
 
+static inline
+struct net_device *dsa_port_to_bridge_port(const struct dsa_port *dp)
+{
+       if (!dp->bridge_dev)
+               return NULL;
+
+       if (dp->lag_dev)
+               return dp->lag_dev;
+       else if (dp->hsr_dev)
+               return dp->hsr_dev;
+
+       return dp->slave;
+}
+
 typedef int dsa_fdb_dump_cb_t(const unsigned char *addr, u16 vid,
                              bool is_static, void *data);
 struct dsa_switch_ops {
index 9d4b0e9b1aa1e3e720ee51670b7558d7ab79122c..4c43c54068342113cf752e9bfcc1b27298f983da 100644 (file)
@@ -233,19 +233,7 @@ extern const struct phylink_mac_ops dsa_port_phylink_mac_ops;
 static inline bool dsa_port_offloads_bridge_port(struct dsa_port *dp,
                                                 struct net_device *dev)
 {
-       /* Switchdev offloading can be configured on: */
-
-       if (dev == dp->slave)
-               /* DSA ports directly connected to a bridge, and event
-                * was emitted for the ports themselves.
-                */
-               return true;
-
-       if (dp->lag_dev == dev)
-               /* DSA ports connected to a bridge via a LAG */
-               return true;
-
-       return false;
+       return dsa_port_to_bridge_port(dp) == dev;
 }
 
 static inline bool dsa_port_offloads_bridge(struct dsa_port *dp,