]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/bnxt_re: Fail probe early when not enough MSI-x vectors are reserved
authorKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Thu, 14 Nov 2024 09:49:05 +0000 (01:49 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 7 Mar 2025 17:25:25 +0000 (18:25 +0100)
[ Upstream commit 65ecee132774e0f15cd76a766eb39ec21118bffc ]

L2 driver allocates and populates the MSI-x vector details for RoCE
in the en_dev structure. RoCE driver requires minimum 2 MSIx vectors.
Hence during probe, driver has to check and bail out if there are not
enough MSI-x vectors reserved for it before proceeding further
initialization.

Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Hongguang Gao <hongguang.gao@broadcom.com>
Reviewed-by: Bhargava Chenna Marreddy <bhargava.marreddy@broadcom.com>
Reviewed-by: Kashyap Desai <kashyap.desai@broadcom.com>
Reviewed-by: Chandramohan Akula <chandramohan.akula@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Link: https://patch.msgid.link/1731577748-1804-2-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Stable-dep-of: f0df225d12fc ("RDMA/bnxt_re: Add sanity checks on rdev validity")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/bnxt_re/bnxt_re.h
drivers/infiniband/hw/bnxt_re/main.c

index e94518b12f86ee1d8eb9650d96330f7dfc5573a8..7a1acad232c5e920325f1b06b27df0df13f71287 100644 (file)
@@ -154,6 +154,8 @@ struct bnxt_re_pacing {
 
 #define BNXT_RE_GRC_FIFO_REG_BASE 0x2000
 
+#define BNXT_RE_MIN_MSIX               2
+
 #define MAX_CQ_HASH_BITS               (16)
 #define MAX_SRQ_HASH_BITS              (16)
 struct bnxt_re_dev {
index 8abd1b723f8ff5bf22885b9d1483625f3880b881..32ecc802afd1365955d8e3199bdc4dacc776934c 100644 (file)
@@ -1653,6 +1653,18 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 op_type)
        }
        set_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags);
 
+       if (rdev->en_dev->ulp_tbl->msix_requested < BNXT_RE_MIN_MSIX) {
+               ibdev_err(&rdev->ibdev,
+                         "RoCE requires minimum 2 MSI-X vectors, but only %d reserved\n",
+                         rdev->en_dev->ulp_tbl->msix_requested);
+               bnxt_unregister_dev(rdev->en_dev);
+               clear_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags);
+               return -EINVAL;
+       }
+       ibdev_dbg(&rdev->ibdev, "Got %d MSI-X vectors\n",
+                 rdev->en_dev->ulp_tbl->msix_requested);
+       rdev->num_msix = rdev->en_dev->ulp_tbl->msix_requested;
+
        rc = bnxt_re_setup_chip_ctx(rdev);
        if (rc) {
                bnxt_unregister_dev(rdev->en_dev);
@@ -1664,16 +1676,6 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 op_type)
        /* Check whether VF or PF */
        bnxt_re_get_sriov_func_type(rdev);
 
-       if (!rdev->en_dev->ulp_tbl->msix_requested) {
-               ibdev_err(&rdev->ibdev,
-                         "Failed to get MSI-X vectors: %#x\n", rc);
-               rc = -EINVAL;
-               goto fail;
-       }
-       ibdev_dbg(&rdev->ibdev, "Got %d MSI-X vectors\n",
-                 rdev->en_dev->ulp_tbl->msix_requested);
-       rdev->num_msix = rdev->en_dev->ulp_tbl->msix_requested;
-
        bnxt_re_query_hwrm_intf_version(rdev);
 
        /* Establish RCFW Communication Channel to initialize the context