diff options
author | Michael Chan <michael.chan@broadcom.com> | 2017-02-07 00:55:40 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-02-07 21:30:59 +0300 |
commit | 5f4492493e75dafc5cbb96eabe0f146c2ffb1e3d (patch) | |
tree | e3b3d8517ba722a0be8ea24e93f7cd102727ece4 /drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | |
parent | a960dec98861b009b4227d2ae3b94a142c83eb96 (diff) | |
download | linux-5f4492493e75dafc5cbb96eabe0f146c2ffb1e3d.tar.xz |
bnxt_en: Add a set of TX rings to support XDP.
Add logic for an extra set of TX rings for XDP. If enabled, this
set of TX rings equals the number of RX rings and shares the same
IRQ as the RX ring set. A new field bp->tx_nr_rings_xdp is added
to keep track of these TX XDP rings. Adjust all other relevant functions
to handle bp->tx_nr_rings_xdp.
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c')
-rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c index 6f2568d2354e..7aa248db10c6 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -389,6 +389,7 @@ static int bnxt_set_channels(struct net_device *dev, struct bnxt *bp = netdev_priv(dev); int req_tx_rings, req_rx_rings, tcs; bool sh = false; + int tx_xdp = 0; int rc = 0; if (channel->other_count) @@ -413,7 +414,14 @@ static int bnxt_set_channels(struct net_device *dev, req_tx_rings = sh ? channel->combined_count : channel->tx_count; req_rx_rings = sh ? channel->combined_count : channel->rx_count; - rc = bnxt_reserve_rings(bp, req_tx_rings, req_rx_rings, tcs); + if (bp->tx_nr_rings_xdp) { + if (!sh) { + netdev_err(dev, "Only combined mode supported when XDP is enabled.\n"); + return -EINVAL; + } + tx_xdp = req_rx_rings; + } + rc = bnxt_reserve_rings(bp, req_tx_rings, req_rx_rings, tcs, tx_xdp); if (rc) { netdev_warn(dev, "Unable to allocate the requested rings\n"); return rc; @@ -442,10 +450,10 @@ static int bnxt_set_channels(struct net_device *dev, bp->rx_nr_rings = channel->rx_count; bp->tx_nr_rings_per_tc = channel->tx_count; } - - bp->tx_nr_rings = bp->tx_nr_rings_per_tc; + bp->tx_nr_rings_xdp = tx_xdp; + bp->tx_nr_rings = bp->tx_nr_rings_per_tc + tx_xdp; if (tcs > 1) - bp->tx_nr_rings = bp->tx_nr_rings_per_tc * tcs; + bp->tx_nr_rings = bp->tx_nr_rings_per_tc * tcs + tx_xdp; bp->cp_nr_rings = sh ? max_t(int, bp->tx_nr_rings, bp->rx_nr_rings) : bp->tx_nr_rings + bp->rx_nr_rings; |