]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bnxt_en: Fix mqprio and XDP ring checking logic
authorMichael Chan <michael.chan@broadcom.com>
Fri, 10 Feb 2023 17:31:55 +0000 (12:31 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 13 Feb 2023 09:57:59 +0000 (09:57 +0000)
In bnxt_reserve_rings(), there is logic to check that the number of TX
rings reserved is enough to cover all the mqprio TCs, but it fails to
account for the TX XDP rings.  So the check will always fail if there
are mqprio TCs and TX XDP rings.  As a result, the driver always fails
to initialize after the XDP program is attached and the device will be
brought down.  A subsequent ifconfig up will also fail because the
number of TX rings is set to an inconsistent number.  Fix the check to
properly account for TX XDP rings.  If the check fails, set the number
of TX rings back to a consistent number after calling netdev_reset_tc().

Fixes: 674f50a5b026 ("bnxt_en: Implement new method to reserve rings.")
Reviewed-by: Hongguang Gao <hongguang.gao@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.c

index 240a7e8a76528ce3615870a5248a453cbd905719..6c32f5c427b523d5d72ee19527cd7492c74e9f8e 100644 (file)
@@ -9274,10 +9274,14 @@ int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init)
                netdev_err(bp->dev, "ring reservation/IRQ init failure rc: %d\n", rc);
                return rc;
        }
-       if (tcs && (bp->tx_nr_rings_per_tc * tcs != bp->tx_nr_rings)) {
+       if (tcs && (bp->tx_nr_rings_per_tc * tcs !=
+                   bp->tx_nr_rings - bp->tx_nr_rings_xdp)) {
                netdev_err(bp->dev, "tx ring reservation failure\n");
                netdev_reset_tc(bp->dev);
-               bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
+               if (bp->tx_nr_rings_xdp)
+                       bp->tx_nr_rings_per_tc = bp->tx_nr_rings_xdp;
+               else
+                       bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
                return -ENOMEM;
        }
        return 0;