Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ded76a8 authored by Florian Fainelli's avatar Florian Fainelli Committed by David S. Miller
Browse files

net: systemport: Only inspect valid switch port & queues



Hesoteric board configurations where port 0 is not available would still
make SYSTEMPORT inspect the switch port 0, queue 0, which, not being
enabled, would cause transmit timeouts over time. Just ignore those
unconfigured rings instead.

Fixes: 84ff33eeb23d ("net: systemport: Establish DSA network device queue mapping")
Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9681ab06
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -1420,8 +1420,12 @@ static int bcm_sysport_init_tx_ring(struct bcm_sysport_priv *priv,
	/* Configure QID and port mapping */
	reg = tdma_readl(priv, TDMA_DESC_RING_MAPPING(index));
	reg &= ~(RING_QID_MASK | RING_PORT_ID_MASK << RING_PORT_ID_SHIFT);
	if (ring->inspect) {
		reg |= ring->switch_queue & RING_QID_MASK;
		reg |= ring->switch_port << RING_PORT_ID_SHIFT;
	} else {
		reg |= RING_IGNORE_STATUS;
	}
	tdma_writel(priv, reg, TDMA_DESC_RING_MAPPING(index));
	tdma_writel(priv, 0, TDMA_DESC_RING_PCP_DEI_VID(index));

@@ -2108,6 +2112,7 @@ static int bcm_sysport_map_queues(struct net_device *dev,
		 */
		ring->switch_queue = q;
		ring->switch_port = port;
		ring->inspect = true;
		priv->ring_map[q + port * num_tx_queues] = ring;

		/* Set all queues as being used now */
+1 −0
Original line number Diff line number Diff line
@@ -714,6 +714,7 @@ struct bcm_sysport_tx_ring {
	unsigned long	bytes;		/* bytes statistics */
	unsigned int	switch_queue;	/* switch port queue number */
	unsigned int	switch_port;	/* switch port queue number */
	bool		inspect;	/* inspect switch port and queue */
};

/* Driver private structure */