From d1e7925e6d80ce5f9ef6deb8f3cec7526f5c443c Mon Sep 17 00:00:00 2001 From: Michael Chan Date: Mon, 6 Feb 2017 16:55:38 -0500 Subject: bnxt_en: Centralize logic to reserve rings. Currently, bnxt_setup_tc() and bnxt_set_channels() have similar and duplicated code to check and reserve rx and tx rings. Add a new function bnxt_reserve_rings() to centralize the logic. This will make it easier to add XDP_TX support which requires allocating a new set of TX rings. Also, the tx ring checking logic in bnxt_setup_msix() can be removed. The rings have been reserved before hand. Signed-off-by: Michael Chan Signed-off-by: David S. Miller --- drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 39 ++++++----------------- 1 file changed, 9 insertions(+), 30 deletions(-) (limited to 'drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c') diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c index 24818e1e59f3..6f2568d2354e 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -387,10 +387,9 @@ static int bnxt_set_channels(struct net_device *dev, struct ethtool_channels *channel) { struct bnxt *bp = netdev_priv(dev); - int max_rx_rings, max_tx_rings, tcs; - int req_tx_rings, rsv_tx_rings; - u32 rc = 0; + int req_tx_rings, req_rx_rings, tcs; bool sh = false; + int rc = 0; if (channel->other_count) return -EINVAL; @@ -410,32 +409,14 @@ static int bnxt_set_channels(struct net_device *dev, if (channel->combined_count) sh = true; - bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, sh); - tcs = netdev_get_num_tc(dev); - if (tcs > 1) - max_tx_rings /= tcs; - - if (sh && - channel->combined_count > max_t(int, max_rx_rings, max_tx_rings)) - return -ENOMEM; - - if (!sh && (channel->rx_count > max_rx_rings || - channel->tx_count > max_tx_rings)) - return -ENOMEM; req_tx_rings = sh ? channel->combined_count : channel->tx_count; - req_tx_rings = min_t(int, req_tx_rings, max_tx_rings); - if (tcs > 1) - req_tx_rings *= tcs; - - rsv_tx_rings = req_tx_rings; - if (bnxt_hwrm_reserve_tx_rings(bp, &rsv_tx_rings)) - return -ENOMEM; - - if (rsv_tx_rings < req_tx_rings) { - netdev_warn(dev, "Unable to allocate the requested tx rings\n"); - return -ENOMEM; + req_rx_rings = sh ? channel->combined_count : channel->rx_count; + rc = bnxt_reserve_rings(bp, req_tx_rings, req_rx_rings, tcs); + if (rc) { + netdev_warn(dev, "Unable to allocate the requested rings\n"); + return rc; } if (netif_running(dev)) { @@ -454,10 +435,8 @@ static int bnxt_set_channels(struct net_device *dev, if (sh) { bp->flags |= BNXT_FLAG_SHARED_RINGS; - 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); + bp->rx_nr_rings = channel->combined_count; + bp->tx_nr_rings_per_tc = channel->combined_count; } else { bp->flags &= ~BNXT_FLAG_SHARED_RINGS; bp->rx_nr_rings = channel->rx_count; -- cgit v1.2.3-55-g7522