diff options
author | Michael Chan <michael.chan@broadcom.com> | 2017-07-11 13:05:35 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-07-11 13:32:11 -0400 |
commit | 3b6b34df342553a7522561e34288f5bb803aa9aa (patch) | |
tree | b4f5d946005dd413f7e2bc35fa4db83c922d98d1 | |
parent | f9b76ebd49f97458857568918c305a17fa7c6567 (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.c | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 2 |
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 */ |
6921 | int bnxt_reserve_rings(struct bnxt *bp, int tx, int rx, int tcs, int tx_xdp) | 6921 | int 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); | |||
1301 | int bnxt_half_open_nic(struct bnxt *bp); | 1301 | int bnxt_half_open_nic(struct bnxt *bp); |
1302 | void bnxt_half_close_nic(struct bnxt *bp); | 1302 | void bnxt_half_close_nic(struct bnxt *bp); |
1303 | int bnxt_close_nic(struct bnxt *, bool, bool); | 1303 | int bnxt_close_nic(struct bnxt *, bool, bool); |
1304 | int bnxt_reserve_rings(struct bnxt *bp, int tx, int rx, int tcs, int tx_xdp); | 1304 | int bnxt_reserve_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs, |
1305 | int tx_xdp); | ||
1305 | int bnxt_setup_mq_tc(struct net_device *dev, u8 tc); | 1306 | int bnxt_setup_mq_tc(struct net_device *dev, u8 tc); |
1306 | int bnxt_get_max_rings(struct bnxt *, int *, int *, bool); | 1307 | int bnxt_get_max_rings(struct bnxt *, int *, int *, bool); |
1307 | void bnxt_restore_pf_fw_resources(struct bnxt *bp); | 1308 | void 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; |