net: dsa: track unique bridge numbers across all DSA switch trees
[linux-2.6-microblaze.git] / net / dsa / port.c
index 979042a..4fbe81f 100644 (file)
@@ -270,27 +270,9 @@ static void dsa_port_switchdev_unsync_attrs(struct dsa_port *dp)
         */
 }
 
-static int dsa_tree_find_bridge_num(struct dsa_switch_tree *dst,
-                                   struct net_device *bridge_dev)
-{
-       struct dsa_port *dp;
-
-       /* When preparing the offload for a port, it will have a valid
-        * dp->bridge_dev pointer but a not yet valid dp->bridge_num.
-        * However there might be other ports having the same dp->bridge_dev
-        * and a valid dp->bridge_num, so just ignore this port.
-        */
-       list_for_each_entry(dp, &dst->ports, list)
-               if (dp->bridge_dev == bridge_dev && dp->bridge_num != -1)
-                       return dp->bridge_num;
-
-       return -1;
-}
-
 static void dsa_port_bridge_tx_fwd_unoffload(struct dsa_port *dp,
                                             struct net_device *bridge_dev)
 {
-       struct dsa_switch_tree *dst = dp->ds->dst;
        int bridge_num = dp->bridge_num;
        struct dsa_switch *ds = dp->ds;
 
@@ -300,11 +282,7 @@ static void dsa_port_bridge_tx_fwd_unoffload(struct dsa_port *dp,
 
        dp->bridge_num = -1;
 
-       /* Check if the bridge is still in use, otherwise it is time
-        * to clean it up so we can reuse this bridge_num later.
-        */
-       if (!dsa_tree_find_bridge_num(dst, bridge_dev))
-               clear_bit(bridge_num, &dst->fwd_offloading_bridges);
+       dsa_bridge_num_put(bridge_dev, bridge_num);
 
        /* Notify the chips only once the offload has been deactivated, so
         * that they can update their configuration accordingly.
@@ -316,23 +294,16 @@ static void dsa_port_bridge_tx_fwd_unoffload(struct dsa_port *dp,
 static bool dsa_port_bridge_tx_fwd_offload(struct dsa_port *dp,
                                           struct net_device *bridge_dev)
 {
-       struct dsa_switch_tree *dst = dp->ds->dst;
        struct dsa_switch *ds = dp->ds;
        int bridge_num, err;
 
        if (!ds->ops->port_bridge_tx_fwd_offload)
                return false;
 
-       bridge_num = dsa_tree_find_bridge_num(dst, bridge_dev);
-       if (bridge_num < 0) {
-               /* First port that offloads TX forwarding for this bridge */
-               bridge_num = find_first_zero_bit(&dst->fwd_offloading_bridges,
-                                                DSA_MAX_NUM_OFFLOADING_BRIDGES);
-               if (bridge_num >= ds->num_fwd_offloading_bridges)
-                       return false;
-
-               set_bit(bridge_num, &dst->fwd_offloading_bridges);
-       }
+       bridge_num = dsa_bridge_num_get(bridge_dev,
+                                       ds->num_fwd_offloading_bridges);
+       if (bridge_num < 0)
+               return false;
 
        dp->bridge_num = bridge_num;