OSDN Git Service

bnxt_en: Improve preset max value for ethtool -l.
authorMichael Chan <michael.chan@broadcom.com>
Sun, 27 Sep 2020 17:42:20 +0000 (13:42 -0400)
committerDavid S. Miller <davem@davemloft.net>
Sun, 27 Sep 2020 20:35:46 +0000 (13:35 -0700)
The current logic that calculates the preset maximum value for combined
channel does not take into account the rings used for XDP and mqprio
TCs.  Each of these features will reduce the number of TX rings.  Add
the logic to divide the TX rings accordingly based on whether the
device is currently in XDP mode and whether TCs are in use.

Reviewed-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 0d9fe14..19b8e3e 100644 (file)
@@ -801,7 +801,7 @@ static void bnxt_get_channels(struct net_device *dev,
        struct bnxt *bp = netdev_priv(dev);
        struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
        int max_rx_rings, max_tx_rings, tcs;
-       int max_tx_sch_inputs;
+       int max_tx_sch_inputs, tx_grps;
 
        /* Get the most up-to-date max_tx_sch_inputs. */
        if (netif_running(dev) && BNXT_NEW_RM(bp))
@@ -811,6 +811,12 @@ static void bnxt_get_channels(struct net_device *dev,
        bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, true);
        if (max_tx_sch_inputs)
                max_tx_rings = min_t(int, max_tx_rings, max_tx_sch_inputs);
+
+       tcs = netdev_get_num_tc(dev);
+       tx_grps = max(tcs, 1);
+       if (bp->tx_nr_rings_xdp)
+               tx_grps++;
+       max_tx_rings /= tx_grps;
        channel->max_combined = min_t(int, max_rx_rings, max_tx_rings);
 
        if (bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, false)) {
@@ -820,7 +826,6 @@ static void bnxt_get_channels(struct net_device *dev,
        if (max_tx_sch_inputs)
                max_tx_rings = min_t(int, max_tx_rings, max_tx_sch_inputs);
 
-       tcs = netdev_get_num_tc(dev);
        if (tcs > 1)
                max_tx_rings /= tcs;