bnxt_en: Fix ethtool -l|-L inconsistent channel counts.
authorMichael Chan <michael.chan@broadcom.com>
Mon, 19 Sep 2016 07:58:04 +0000 (03:58 -0400)
committerDavid S. Miller <davem@davemloft.net>
Tue, 20 Sep 2016 01:32:25 +0000 (21:32 -0400)
The existing code is inconsistent in reporting and accepting the combined
channel count.  bnxt_get_channels() reports maximum combined as the
maximum rx count.  bnxt_set_channels() accepts combined count that
cannot be bigger than max rx or max tx.

For example, if max rx = 2 and max tx = 1, we report max supported
combined to be 2.  But if the user tries to set combined to 2, it will
fail because 2 is bigger than max tx which is 1.

Fix the code to be consistent.  Max allowed combined = max(max_rx, max_tx).
We will accept a combined channel count <= max(max_rx, max_tx).

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 4a430b623489b3f57015579a93b1a57b2e94dd23..c74ce698805e90b9f27bd1906f91ed79cdb5f537 100644 (file)
@@ -348,7 +348,7 @@ 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;
+       channel->max_combined = max_t(int, max_rx_rings, max_tx_rings);
 
        if (bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, false)) {
                max_rx_rings = 0;
@@ -406,8 +406,8 @@ static int bnxt_set_channels(struct net_device *dev,
        if (tcs > 1)
                max_tx_rings /= tcs;
 
-       if (sh && (channel->combined_count > max_rx_rings ||
-                  channel->combined_count > max_tx_rings))
+       if (sh &&
+           channel->combined_count > max_t(int, max_rx_rings, max_tx_rings))
                return -ENOMEM;
 
        if (!sh && (channel->rx_count > max_rx_rings ||
@@ -430,8 +430,10 @@ 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;
+               bp->rx_nr_rings = min_t(int, channel->combined_count,
+                                       max_rx_rings);
+               bp->tx_nr_rings_per_tc = min_t(int, channel->combined_count,
+                                              max_tx_rings);
        } else {
                bp->flags &= ~BNXT_FLAG_SHARED_RINGS;
                bp->rx_nr_rings = channel->rx_count;