aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <michael.chan@broadcom.com>2017-07-11 13:05:35 -0400
committerDavid S. Miller <davem@davemloft.net>2017-07-11 13:32:11 -0400
commit3b6b34df342553a7522561e34288f5bb803aa9aa (patch)
treeb4f5d946005dd413f7e2bc35fa4db83c922d98d1
parentf9b76ebd49f97458857568918c305a17fa7c6567 (diff)
bnxt_en: Fix bug in ethtool -L.
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>
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.c9
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.h3
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c3
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c2
4 files changed, 8 insertions, 9 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 415694d37989..d9830d09e6c3 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -6918,16 +6918,13 @@ static void bnxt_sp_task(struct work_struct *work)
6918} 6918}
6919 6919
6920/* Under rtnl_lock */ 6920/* Under rtnl_lock */
6921int bnxt_reserve_rings(struct bnxt *bp, int tx, int rx, int tcs, int tx_xdp) 6921int bnxt_reserve_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,
6922 int tx_xdp)
6922{ 6923{
6923 int max_rx, max_tx, tx_sets = 1; 6924 int max_rx, max_tx, tx_sets = 1;
6924 int tx_rings_needed; 6925 int tx_rings_needed;
6925 bool sh = true;
6926 int rc; 6926 int rc;
6927 6927
6928 if (!(bp->flags & BNXT_FLAG_SHARED_RINGS))
6929 sh = false;
6930
6931 if (tcs) 6928 if (tcs)
6932 tx_sets = tcs; 6929 tx_sets = tcs;
6933 6930
@@ -7135,7 +7132,7 @@ int bnxt_setup_mq_tc(struct net_device *dev, u8 tc)
7135 sh = true; 7132 sh = true;
7136 7133
7137 rc = bnxt_reserve_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings, 7134 rc = bnxt_reserve_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings,
7138 tc, bp->tx_nr_rings_xdp); 7135 sh, tc, bp->tx_nr_rings_xdp);
7139 if (rc) 7136 if (rc)
7140 return rc; 7137 return rc;
7141 7138
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index 3c9d484dbd4e..f34691f85602 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -1301,7 +1301,8 @@ int bnxt_open_nic(struct bnxt *, bool, bool);
1301int bnxt_half_open_nic(struct bnxt *bp); 1301int bnxt_half_open_nic(struct bnxt *bp);
1302void bnxt_half_close_nic(struct bnxt *bp); 1302void bnxt_half_close_nic(struct bnxt *bp);
1303int bnxt_close_nic(struct bnxt *, bool, bool); 1303int bnxt_close_nic(struct bnxt *, bool, bool);
1304int bnxt_reserve_rings(struct bnxt *bp, int tx, int rx, int tcs, int tx_xdp); 1304int bnxt_reserve_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,
1305 int tx_xdp);
1305int bnxt_setup_mq_tc(struct net_device *dev, u8 tc); 1306int bnxt_setup_mq_tc(struct net_device *dev, u8 tc);
1306int bnxt_get_max_rings(struct bnxt *, int *, int *, bool); 1307int bnxt_get_max_rings(struct bnxt *, int *, int *, bool);
1307void bnxt_restore_pf_fw_resources(struct bnxt *bp); 1308void bnxt_restore_pf_fw_resources(struct bnxt *bp);
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
index fd1181510b65..be6acadcb202 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
@@ -432,7 +432,8 @@ static int bnxt_set_channels(struct net_device *dev,
432 } 432 }
433 tx_xdp = req_rx_rings; 433 tx_xdp = req_rx_rings;
434 } 434 }
435 rc = bnxt_reserve_rings(bp, req_tx_rings, req_rx_rings, tcs, tx_xdp); 435 rc = bnxt_reserve_rings(bp, req_tx_rings, req_rx_rings, sh, tcs,
436 tx_xdp);
436 if (rc) { 437 if (rc) {
437 netdev_warn(dev, "Unable to allocate the requested rings\n"); 438 netdev_warn(dev, "Unable to allocate the requested rings\n");
438 return rc; 439 return rc;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
index 7d67552e70d7..3961a6807454 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
@@ -170,7 +170,7 @@ static int bnxt_xdp_set(struct bnxt *bp, struct bpf_prog *prog)
170 if (!tc) 170 if (!tc)
171 tc = 1; 171 tc = 1;
172 rc = bnxt_reserve_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings, 172 rc = bnxt_reserve_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings,
173 tc, tx_xdp); 173 true, tc, tx_xdp);
174 if (rc) { 174 if (rc) {
175 netdev_warn(dev, "Unable to reserve enough TX rings to support XDP.\n"); 175 netdev_warn(dev, "Unable to reserve enough TX rings to support XDP.\n");
176 return rc; 176 return rc;