Commit 5a9ef194 authored by Florian Fainelli's avatar Florian Fainelli Committed by David S. Miller

net: systemport: Fixed queue mapping in internal ring map

We would not be transmitting using the correct SYSTEMPORT transmit queue
during ndo_select_queue() which looks up the internal TX ring map
because while establishing the mapping we would be off by 4, so for
instance, when we populate switch port mappings we would be doing:

switch port 0, queue 0 -> ring index #0
switch port 0, queue 1 -> ring index #1
...
switch port 0, queue 3 -> ring index #3
switch port 1, queue 0 -> ring index #8 (4 + 4 * 1)
...

instead of using ring index #4. This would cause our ndo_select_queue()
to use the fallback queue mechanism which would pick up an incorrect
ring for that switch port. Fix this by using the correct switch queue
number instead of SYSTEMPORT queue number.

Fixes: 25c44070 ("net: systemport: Simplify queue mapping logic")
Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8f1880cb
...@@ -2323,7 +2323,7 @@ static int bcm_sysport_map_queues(struct notifier_block *nb, ...@@ -2323,7 +2323,7 @@ static int bcm_sysport_map_queues(struct notifier_block *nb,
ring->switch_queue = qp; ring->switch_queue = qp;
ring->switch_port = port; ring->switch_port = port;
ring->inspect = true; ring->inspect = true;
priv->ring_map[q + port * num_tx_queues] = ring; priv->ring_map[qp + port * num_tx_queues] = ring;
qp++; qp++;
} }
...@@ -2338,7 +2338,7 @@ static int bcm_sysport_unmap_queues(struct notifier_block *nb, ...@@ -2338,7 +2338,7 @@ static int bcm_sysport_unmap_queues(struct notifier_block *nb,
struct net_device *slave_dev; struct net_device *slave_dev;
unsigned int num_tx_queues; unsigned int num_tx_queues;
struct net_device *dev; struct net_device *dev;
unsigned int q, port; unsigned int q, qp, port;
priv = container_of(nb, struct bcm_sysport_priv, dsa_notifier); priv = container_of(nb, struct bcm_sysport_priv, dsa_notifier);
if (priv->netdev != info->master) if (priv->netdev != info->master)
...@@ -2364,7 +2364,8 @@ static int bcm_sysport_unmap_queues(struct notifier_block *nb, ...@@ -2364,7 +2364,8 @@ static int bcm_sysport_unmap_queues(struct notifier_block *nb,
continue; continue;
ring->inspect = false; ring->inspect = false;
priv->ring_map[q + port * num_tx_queues] = NULL; qp = ring->switch_queue;
priv->ring_map[qp + port * num_tx_queues] = NULL;
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment