]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
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)
committerDhaval Giani <dhaval.giani@oracle.com>
Fri, 20 Jan 2017 18:07:39 +0000 (13:07 -0500)
Orabug: 24567991

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>
(cherry picked from commit 47f8e8b9bbbbe00740786bd1da0d5097d45ba46b)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
Signed-off-by: Dhaval Giani <dhaval.giani@oracle.com>
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index ebf46f7578910d0b0de8fdf595d68671608a1083..0260390798b516e9eb9d92c10037cd34641cdec9 100644 (file)
@@ -353,7 +353,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;
@@ -411,8 +411,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 ||
@@ -435,8 +435,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;