]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/bnxt_re: Cache MSIx info to a local structure
authorKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Thu, 14 Nov 2024 09:49:08 +0000 (01:49 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 7 Mar 2025 17:25:25 +0000 (18:25 +0100)
[ Upstream commit 31bad59805c388f92f3a13174a149c2228301c15 ]

L2 driver allocates the vectors for RoCE and pass it through the
en_dev structure to RoCE. During probe, cache the MSIx related
info to a local structure.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Link: https://patch.msgid.link/1731577748-1804-5-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 2a5cb66402860f35f7ded04e47d0e35a0832bf52..784dc0fbd52684e324ad484d70d1a93f42afd729 100644 (file)
@@ -157,6 +157,7 @@ struct bnxt_re_pacing {
 #define BNXT_RE_MIN_MSIX               2
 #define BNXT_RE_MAX_MSIX               BNXT_MAX_ROCE_MSIX
 struct bnxt_re_nq_record {
+       struct bnxt_msix_entry  msix_entries[BNXT_RE_MAX_MSIX];
        struct bnxt_qplib_nq    nq[BNXT_RE_MAX_MSIX];
        int                     num_msix;
 };
index 310a80962d0eb25207eeace7c11145afe66daeeb..08cc9ea1752767ed7c2d4850896a5ac3e641ce7a 100644 (file)
@@ -334,7 +334,7 @@ static void bnxt_re_start_irq(void *handle, struct bnxt_msix_entry *ent)
        int indx, rc;
 
        rdev = en_info->rdev;
-       msix_ent = rdev->en_dev->msix_entries;
+       msix_ent = rdev->nqr->msix_entries;
        rcfw = &rdev->rcfw;
        if (!ent) {
                /* Not setting the f/w timeout bit in rcfw.
@@ -350,7 +350,7 @@ static void bnxt_re_start_irq(void *handle, struct bnxt_msix_entry *ent)
         * in device sctructure.
         */
        for (indx = 0; indx < rdev->nqr->num_msix; indx++)
-               rdev->en_dev->msix_entries[indx].vector = ent[indx].vector;
+               rdev->nqr->msix_entries[indx].vector = ent[indx].vector;
 
        rc = bnxt_qplib_rcfw_start_irq(rcfw, msix_ent[BNXT_RE_AEQ_IDX].vector,
                                       false);
@@ -1292,9 +1292,9 @@ static int bnxt_re_init_res(struct bnxt_re_dev *rdev)
        bnxt_qplib_init_res(&rdev->qplib_res);
 
        for (i = 1; i < rdev->nqr->num_msix ; i++) {
-               db_offt = rdev->en_dev->msix_entries[i].db_offset;
+               db_offt = rdev->nqr->msix_entries[i].db_offset;
                rc = bnxt_qplib_enable_nq(rdev->en_dev->pdev, &rdev->nqr->nq[i - 1],
-                                         i - 1, rdev->en_dev->msix_entries[i].vector,
+                                         i - 1, rdev->nqr->msix_entries[i].vector,
                                          db_offt, &bnxt_re_cqn_handler,
                                          &bnxt_re_srqn_handler);
                if (rc) {
@@ -1381,7 +1381,7 @@ static int bnxt_re_alloc_res(struct bnxt_re_dev *rdev)
                rattr.type = type;
                rattr.mode = RING_ALLOC_REQ_INT_MODE_MSIX;
                rattr.depth = BNXT_QPLIB_NQE_MAX_CNT - 1;
-               rattr.lrid = rdev->en_dev->msix_entries[i + 1].ring_idx;
+               rattr.lrid = rdev->nqr->msix_entries[i + 1].ring_idx;
                rc = bnxt_re_net_ring_alloc(rdev, &rattr, &nq->ring_id);
                if (rc) {
                        ibdev_err(&rdev->ibdev,
@@ -1698,6 +1698,8 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 op_type)
                return rc;
        }
        rdev->nqr->num_msix = rdev->en_dev->ulp_tbl->msix_requested;
+       memcpy(rdev->nqr->msix_entries, rdev->en_dev->msix_entries,
+              sizeof(struct bnxt_msix_entry) * rdev->nqr->num_msix);
 
        /* Check whether VF or PF */
        bnxt_re_get_sriov_func_type(rdev);
@@ -1723,14 +1725,14 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 op_type)
        rattr.type = type;
        rattr.mode = RING_ALLOC_REQ_INT_MODE_MSIX;
        rattr.depth = BNXT_QPLIB_CREQE_MAX_CNT - 1;
-       rattr.lrid = rdev->en_dev->msix_entries[BNXT_RE_AEQ_IDX].ring_idx;
+       rattr.lrid = rdev->nqr->msix_entries[BNXT_RE_AEQ_IDX].ring_idx;
        rc = bnxt_re_net_ring_alloc(rdev, &rattr, &creq->ring_id);
        if (rc) {
                ibdev_err(&rdev->ibdev, "Failed to allocate CREQ: %#x\n", rc);
                goto free_rcfw;
        }
-       db_offt = rdev->en_dev->msix_entries[BNXT_RE_AEQ_IDX].db_offset;
-       vid = rdev->en_dev->msix_entries[BNXT_RE_AEQ_IDX].vector;
+       db_offt = rdev->nqr->msix_entries[BNXT_RE_AEQ_IDX].db_offset;
+       vid = rdev->nqr->msix_entries[BNXT_RE_AEQ_IDX].vector;
        rc = bnxt_qplib_enable_rcfw_channel(&rdev->rcfw,
                                            vid, db_offt,
                                            &bnxt_re_aeq_handler);