]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bnxt_en: Fix bug in ethtool -L.
authorMichael Chan <michael.chan@broadcom.com>
Tue, 11 Jul 2017 17:05:35 +0000 (13:05 -0400)
committerBrian Maly <brian.maly@oracle.com>
Mon, 8 Oct 2018 16:21:20 +0000 (12:21 -0400)
When changing channels from combined to rx/tx or vice versa, the code
uses the wrong "sh" parameter to determine if we are reserving rings
for shared or non-shared mode.  It should be using the ethtool requested
"sh" parameter instead of the current "sh" parameter.

Fix it by passing the "sh" parameter to bnxt_reserve_rings().  For
ethtool, we will pass in the requested "sh" parameter.

Fixes: 391be5c27364 ("bnxt_en: Implement new scheme to reserve tx rings.")
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
[ Upstream commit 3b6b34df342553a7522561e34288f5bb803aa9aa ]
Orabug: 27988326

Signed-off-by: Somasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com>
Reviewed-by: Brian Maly <brian.maly@oracle.com>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c

index c5526cfb997d912152eedaf163a489a0c6252c6c..6b873b76d9d34c559b20062cea6fdd9068c7c8f2 100644 (file)
@@ -7425,17 +7425,13 @@ static void bnxt_sp_task(struct work_struct *work)
 }
 
 /* Under rtnl_lock */
-int bnxt_check_rings(struct bnxt *bp, int tx, int rx, int tcs, int tx_xdp)
+int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs, int tx_xdp)
 {
        int max_rx, max_tx, tx_sets = 1;
        int tx_rings_needed;
-       bool sh = true;
        int rx_rings = rx;
        int cp, rc;
 
-       if (!(bp->flags & BNXT_FLAG_SHARED_RINGS))
-               sh = false;
-
        if (tcs)
                tx_sets = tcs;
 
@@ -7659,7 +7655,7 @@ int bnxt_setup_mq_tc(struct net_device *dev, u8 tc)
                sh = true;
 
        rc = bnxt_check_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings,
-                               tc, bp->tx_nr_rings_xdp);
+                             sh, tc, bp->tx_nr_rings_xdp);
        if (rc)
                return rc;
 
index 826e02ec797005aa24230fbb0cf2c8866b3d2942..968a70298d18ecedad03b23dfa00383726414e18 100644 (file)
@@ -1341,7 +1341,7 @@ int bnxt_open_nic(struct bnxt *, bool, bool);
 int bnxt_half_open_nic(struct bnxt *bp);
 void bnxt_half_close_nic(struct bnxt *bp);
 int bnxt_close_nic(struct bnxt *, bool, bool);
-int bnxt_check_rings(struct bnxt *bp, int tx, int rx, int tcs, int tx_xdp);
+int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs, int tx_xdp);
 int bnxt_setup_mq_tc(struct net_device *dev, u8 tc);
 int bnxt_get_max_rings(struct bnxt *, int *, int *, bool);
 int bnxt_restore_pf_fw_resources(struct bnxt *bp);
index 08fd62e8f1fcfce373258fc7620b667aed2ed558..eca3658dc2a5a78b94c181e000a02ce9f8bc8d4c 100644 (file)
@@ -446,7 +446,7 @@ static int bnxt_set_channels(struct net_device *dev,
                }
                tx_xdp = req_rx_rings;
        }
-       rc = bnxt_check_rings(bp, req_tx_rings, req_rx_rings, tcs, tx_xdp);
+       rc = bnxt_check_rings(bp, req_tx_rings, req_rx_rings, sh, tcs, tx_xdp);
        if (rc) {
                netdev_warn(dev, "Unable to allocate the requested rings\n");
                return rc;
index 969a75b0729e5e9a04f6a6382f4cece49ee1edd2..2c554260307115dc98682f0fd5abca8627bfe5af 100644 (file)
@@ -174,8 +174,8 @@ static int bnxt_xdp_set(struct bnxt *bp, struct bpf_prog *prog)
        tc = netdev_get_num_tc(dev);
        if (!tc)
                tc = 1;
-       rc = bnxt_reserve_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings,
-                               tc, tx_xdp);
+       rc = bnxt_check_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings,
+                             true, tc, tx_xdp);
        if (rc) {
                netdev_warn(dev, "Unable to reserve enough TX rings to support XDP.\n");
                return rc;