]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bnxt_en: Refactor some basic ring setup and adjustment logic
authorMichael Chan <michael.chan@broadcom.com>
Tue, 31 Mar 2026 06:51:36 +0000 (23:51 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 2 Apr 2026 03:12:56 +0000 (20:12 -0700)
Refactor out the basic code that trims the default rings, sets up and
adjusts XDP TX rings and CP rings.  There is no change in behavior.
This is to prepare for the next bug fix patch.

Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20260331065138.948205-2-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c

index 7ed805713fbbe0bbc318e33624fc44de27b8467b..173f962fc2abe052f6c85467934b3a11ad120741 100644 (file)
@@ -12992,6 +12992,21 @@ static int bnxt_tx_nr_rings_per_tc(struct bnxt *bp)
        return bp->num_tc ? bp->tx_nr_rings / bp->num_tc : bp->tx_nr_rings;
 }
 
+static void bnxt_set_xdp_tx_rings(struct bnxt *bp)
+{
+       bp->tx_nr_rings_xdp = bp->tx_nr_rings_per_tc;
+       bp->tx_nr_rings += bp->tx_nr_rings_xdp;
+}
+
+static void bnxt_adj_tx_rings(struct bnxt *bp)
+{
+       /* Make adjustments if reserved TX rings are less than requested */
+       bp->tx_nr_rings -= bp->tx_nr_rings_xdp;
+       bp->tx_nr_rings_per_tc = bnxt_tx_nr_rings_per_tc(bp);
+       if (bp->tx_nr_rings_xdp)
+               bnxt_set_xdp_tx_rings(bp);
+}
+
 static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
 {
        int rc = 0;
@@ -13009,13 +13024,7 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
        if (rc)
                return rc;
 
-       /* Make adjustments if reserved TX rings are less than requested */
-       bp->tx_nr_rings -= bp->tx_nr_rings_xdp;
-       bp->tx_nr_rings_per_tc = bnxt_tx_nr_rings_per_tc(bp);
-       if (bp->tx_nr_rings_xdp) {
-               bp->tx_nr_rings_xdp = bp->tx_nr_rings_per_tc;
-               bp->tx_nr_rings += bp->tx_nr_rings_xdp;
-       }
+       bnxt_adj_tx_rings(bp);
        rc = bnxt_alloc_mem(bp, irq_re_init);
        if (rc) {
                netdev_err(bp->dev, "bnxt_alloc_mem err: %x\n", rc);
@@ -15436,11 +15445,19 @@ static int bnxt_change_mtu(struct net_device *dev, int new_mtu)
        return 0;
 }
 
+void bnxt_set_cp_rings(struct bnxt *bp, bool sh)
+{
+       int tx_cp = bnxt_num_tx_to_cp(bp, bp->tx_nr_rings);
+
+       bp->cp_nr_rings = sh ? max_t(int, tx_cp, bp->rx_nr_rings) :
+                              tx_cp + bp->rx_nr_rings;
+}
+
 int bnxt_setup_mq_tc(struct net_device *dev, u8 tc)
 {
        struct bnxt *bp = netdev_priv(dev);
        bool sh = false;
-       int rc, tx_cp;
+       int rc;
 
        if (tc > bp->max_tc) {
                netdev_err(dev, "Too many traffic classes requested: %d. Max supported is %d.\n",
@@ -15473,9 +15490,7 @@ int bnxt_setup_mq_tc(struct net_device *dev, u8 tc)
                bp->num_tc = 0;
        }
        bp->tx_nr_rings += bp->tx_nr_rings_xdp;
-       tx_cp = bnxt_num_tx_to_cp(bp, bp->tx_nr_rings);
-       bp->cp_nr_rings = sh ? max_t(int, tx_cp, bp->rx_nr_rings) :
-                              tx_cp + bp->rx_nr_rings;
+       bnxt_set_cp_rings(bp, sh);
 
        if (netif_running(bp->dev))
                return bnxt_open_nic(bp, true, false);
@@ -16525,6 +16540,15 @@ static void bnxt_trim_dflt_sh_rings(struct bnxt *bp)
        bp->tx_nr_rings = bnxt_tx_nr_rings(bp);
 }
 
+static void bnxt_adj_dflt_rings(struct bnxt *bp, bool sh)
+{
+       if (sh)
+               bnxt_trim_dflt_sh_rings(bp);
+       else
+               bp->cp_nr_rings = bp->tx_nr_rings_per_tc + bp->rx_nr_rings;
+       bp->tx_nr_rings = bnxt_tx_nr_rings(bp);
+}
+
 static int bnxt_set_dflt_rings(struct bnxt *bp, bool sh)
 {
        int dflt_rings, max_rx_rings, max_tx_rings, rc;
@@ -16550,11 +16574,8 @@ static int bnxt_set_dflt_rings(struct bnxt *bp, bool sh)
                return rc;
        bp->rx_nr_rings = min_t(int, dflt_rings, max_rx_rings);
        bp->tx_nr_rings_per_tc = min_t(int, dflt_rings, max_tx_rings);
-       if (sh)
-               bnxt_trim_dflt_sh_rings(bp);
-       else
-               bp->cp_nr_rings = bp->tx_nr_rings_per_tc + bp->rx_nr_rings;
-       bp->tx_nr_rings = bnxt_tx_nr_rings(bp);
+
+       bnxt_adj_dflt_rings(bp, sh);
 
        avail_msix = bnxt_get_max_func_irqs(bp) - bp->cp_nr_rings;
        if (avail_msix >= BNXT_MIN_ROCE_CP_RINGS) {
index a97d651130dfb821f5c6d53dec51c34b8cfb28ff..4bc7f7aeaab37892f2960a1f62000e6f87795393 100644 (file)
@@ -2985,6 +2985,7 @@ int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,
                     int tx_xdp);
 int bnxt_fw_init_one(struct bnxt *bp);
 bool bnxt_hwrm_reset_permitted(struct bnxt *bp);
+void bnxt_set_cp_rings(struct bnxt *bp, bool sh);
 int bnxt_setup_mq_tc(struct net_device *dev, u8 tc);
 struct bnxt_ntuple_filter *bnxt_lookup_ntp_filter_from_idx(struct bnxt *bp,
                                struct bnxt_ntuple_filter *fltr, u32 idx);
index 28d0ece2e7b1fbf203496b94027d090e59c5b348..0407aa1b3190e41bb8e14a96810f485b5cc43efd 100644 (file)
@@ -945,7 +945,6 @@ static int bnxt_set_channels(struct net_device *dev,
        bool sh = false;
        int tx_xdp = 0;
        int rc = 0;
-       int tx_cp;
 
        if (channel->other_count)
                return -EINVAL;
@@ -1013,9 +1012,7 @@ static int bnxt_set_channels(struct net_device *dev,
        if (tcs > 1)
                bp->tx_nr_rings = bp->tx_nr_rings_per_tc * tcs + tx_xdp;
 
-       tx_cp = bnxt_num_tx_to_cp(bp, bp->tx_nr_rings);
-       bp->cp_nr_rings = sh ? max_t(int, tx_cp, bp->rx_nr_rings) :
-                              tx_cp + bp->rx_nr_rings;
+       bnxt_set_cp_rings(bp, sh);
 
        /* After changing number of rx channels, update NTUPLE feature. */
        netdev_update_features(dev);
index 85cbeb35681c25dd9751b5434a2285f8fd17cb4e..bebe37e139c94c235f734a0f89c39efe1542f927 100644 (file)
@@ -384,7 +384,7 @@ int bnxt_xdp_xmit(struct net_device *dev, int num_frames,
 static int bnxt_xdp_set(struct bnxt *bp, struct bpf_prog *prog)
 {
        struct net_device *dev = bp->dev;
-       int tx_xdp = 0, tx_cp, rc, tc;
+       int tx_xdp = 0, rc, tc;
        struct bpf_prog *old;
 
        netdev_assert_locked(dev);
@@ -431,8 +431,7 @@ static int bnxt_xdp_set(struct bnxt *bp, struct bpf_prog *prog)
        }
        bp->tx_nr_rings_xdp = tx_xdp;
        bp->tx_nr_rings = bp->tx_nr_rings_per_tc * tc + tx_xdp;
-       tx_cp = bnxt_num_tx_to_cp(bp, bp->tx_nr_rings);
-       bp->cp_nr_rings = max_t(int, tx_cp, bp->rx_nr_rings);
+       bnxt_set_cp_rings(bp, true);
        bnxt_set_tpa_flags(bp);
        bnxt_set_ring_params(bp);