net: systemport: Simplify queue mapping logic
authorFlorian Fainelli <f.fainelli@gmail.com>
Tue, 6 Nov 2018 23:15:17 +0000 (15:15 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 6 Nov 2018 23:39:48 +0000 (15:39 -0800)
The use of a bitmap speeds up the finding of the first available queue
to which we could start establishing the mapping for, but we still have
to loop over all slave network devices to set them up. Simplify the
logic to have a single loop, and use the fact that a correctly
configured ring has inspect set to true. This will make things simpler
to unwind during device unregistration.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bcmsysport.c
drivers/net/ethernet/broadcom/bcmsysport.h

index 2e60dda32adcbe6cff82352474ed8b4965679700..a161d3282321678656555f4789ae6c250b5de3a1 100644 (file)
@@ -2324,7 +2324,7 @@ static int bcm_sysport_map_queues(struct notifier_block *nb,
        struct bcm_sysport_priv *priv;
        struct net_device *slave_dev;
        unsigned int num_tx_queues;
-       unsigned int q, start, port;
+       unsigned int q, qp, port;
        struct net_device *dev;
 
        priv = container_of(nb, struct bcm_sysport_priv, dsa_notifier);
@@ -2363,20 +2363,21 @@ static int bcm_sysport_map_queues(struct notifier_block *nb,
 
        priv->per_port_num_tx_queues = num_tx_queues;
 
-       start = find_first_zero_bit(&priv->queue_bitmap, dev->num_tx_queues);
-       for (q = 0; q < num_tx_queues; q++) {
-               ring = &priv->tx_rings[q + start];
+       for (q = 0, qp = 0; q < dev->num_tx_queues && qp < num_tx_queues;
+            q++) {
+               ring = &priv->tx_rings[q];
+
+               if (ring->inspect)
+                       continue;
 
                /* Just remember the mapping actual programming done
                 * during bcm_sysport_init_tx_ring
                 */
-               ring->switch_queue = q;
+               ring->switch_queue = qp;
                ring->switch_port = port;
                ring->inspect = true;
                priv->ring_map[q + port * num_tx_queues] = ring;
-
-               /* Set all queues as being used now */
-               set_bit(q + start, &priv->queue_bitmap);
+               qp++;
        }
 
        return 0;
index 7a0b7bfedd19a33ec6488886c5df263662f0bfaa..0887e63566499b4bee2ac1041315cc6c790c3019 100644 (file)
@@ -796,7 +796,6 @@ struct bcm_sysport_priv {
        /* map information between switch port queues and local queues */
        struct notifier_block   dsa_notifier;
        unsigned int            per_port_num_tx_queues;
-       unsigned long           queue_bitmap;
        struct bcm_sysport_tx_ring *ring_map[DSA_MAX_PORTS * 8];
 
 };