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

Commit 068c9ec6 authored by Michael Chan's avatar Michael Chan Committed by David S. Miller
Browse files

bnxt_en: Modify ethtool -l|-L to support combined or rx/tx rings.



The driver can support either all combined or all rx/tx rings.  The
default is combined, but the user can now select rx/tx rings.

Signed-off-by: default avatarMichael Chan <mchan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 01657bcd
Loading
Loading
Loading
Loading
+45 −12
Original line number Diff line number Diff line
@@ -212,6 +212,9 @@ static void bnxt_get_channels(struct net_device *dev,
	int max_rx_rings, max_tx_rings, tcs;

	bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, true);
	channel->max_combined = max_rx_rings;

	bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, false);
	tcs = netdev_get_num_tc(dev);
	if (tcs > 1)
		max_tx_rings /= tcs;
@@ -219,10 +222,13 @@ static void bnxt_get_channels(struct net_device *dev,
	channel->max_rx = max_rx_rings;
	channel->max_tx = max_tx_rings;
	channel->max_other = 0;
	channel->max_combined = 0;
	if (bp->flags & BNXT_FLAG_SHARED_RINGS) {
		channel->combined_count = bp->rx_nr_rings;
	} else {
		channel->rx_count = bp->rx_nr_rings;
		channel->tx_count = bp->tx_nr_rings_per_tc;
	}
}

static int bnxt_set_channels(struct net_device *dev,
			     struct ethtool_channels *channel)
@@ -230,19 +236,35 @@ static int bnxt_set_channels(struct net_device *dev,
	struct bnxt *bp = netdev_priv(dev);
	int max_rx_rings, max_tx_rings, tcs;
	u32 rc = 0;
	bool sh = false;

	if (channel->other_count || channel->combined_count ||
	    !channel->rx_count || !channel->tx_count)
	if (channel->other_count)
		return -EINVAL;

	bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, true);
	if (!channel->combined_count &&
	    (!channel->rx_count || !channel->tx_count))
		return -EINVAL;

	if (channel->combined_count &&
	    (channel->rx_count || channel->tx_count))
		return -EINVAL;

	if (channel->combined_count)
		sh = true;

	bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, sh);

	tcs = netdev_get_num_tc(dev);
	if (tcs > 1)
		max_tx_rings /= tcs;

	if (channel->rx_count > max_rx_rings ||
	    channel->tx_count > max_tx_rings)
		return -EINVAL;
	if (sh && (channel->combined_count > max_rx_rings ||
		   channel->combined_count > max_tx_rings))
		return -ENOMEM;

	if (!sh && (channel->rx_count > max_rx_rings ||
		    channel->tx_count > max_tx_rings))
		return -ENOMEM;

	if (netif_running(dev)) {
		if (BNXT_PF(bp)) {
@@ -258,12 +280,23 @@ static int bnxt_set_channels(struct net_device *dev,
		}
	}

	if (sh) {
		bp->flags |= BNXT_FLAG_SHARED_RINGS;
		bp->rx_nr_rings = channel->combined_count;
		bp->tx_nr_rings_per_tc = channel->combined_count;
	} else {
		bp->flags &= ~BNXT_FLAG_SHARED_RINGS;
		bp->rx_nr_rings = channel->rx_count;
		bp->tx_nr_rings_per_tc = channel->tx_count;
	}

	bp->tx_nr_rings = bp->tx_nr_rings_per_tc;
	if (tcs > 1)
		bp->tx_nr_rings = bp->tx_nr_rings_per_tc * tcs;
	bp->cp_nr_rings = max_t(int, bp->tx_nr_rings, bp->rx_nr_rings);

	bp->cp_nr_rings = sh ? max_t(int, bp->tx_nr_rings, bp->rx_nr_rings) :
			       bp->tx_nr_rings + bp->rx_nr_rings;

	bp->num_stat_ctxs = bp->cp_nr_rings;

	/* After changing number of rx channels, update NTUPLE feature. */