]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
RDMA/bnxt_re: wraparound mbox producer index
authorKashyap Desai <kashyap.desai@broadcom.com>
Fri, 9 Jun 2023 11:01:38 +0000 (04:01 -0700)
committerRoxana Nicolescu <roxana.nicolescu@canonical.com>
Mon, 2 Oct 2023 15:19:45 +0000 (17:19 +0200)
BugLink: https://bugs.launchpad.net/bugs/2034469
[ Upstream commit 0af91306e17ef3d18e5f100aa58aa787869118af ]

Driver is not handling the wraparound of the mbox producer index correctly.
Currently the wraparound happens once u32 max is reached.

Bit 31 of the producer index register is special and should be set
only once for the first command. Because the producer index overflow
setting bit31 after a long time, FW goes to initialization sequence
and this causes FW hang.

Fix is to wraparound the mbox producer index once it reaches u16 max.

Fixes: cee0c7bba486 ("RDMA/bnxt_re: Refactor command queue management code")
Fixes: 1ac5a4047975 ("RDMA/bnxt_re: Add bnxt_re RoCE driver")
Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Link: https://lore.kernel.org/r/1686308514-11996-2-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
drivers/infiniband/hw/bnxt_re/qplib_rcfw.c

index 9c63b8b62edfc0b1b43d7a39351c2db72160ae97..3d76fa71641a4744ce663bd57fd2d050825803b8 100644 (file)
@@ -181,7 +181,7 @@ static int __send_message(struct bnxt_qplib_rcfw *rcfw, struct cmdq_base *req,
        } while (size > 0);
        cmdq->seq_num++;
 
-       cmdq_prod = hwq->prod;
+       cmdq_prod = hwq->prod & 0xFFFF;
        if (test_bit(FIRMWARE_FIRST_FLAG, &cmdq->flags)) {
                /* The very first doorbell write
                 * is required to set this flag
@@ -598,7 +598,7 @@ int bnxt_qplib_alloc_rcfw_channel(struct bnxt_qplib_res *res,
                rcfw->cmdq_depth = BNXT_QPLIB_CMDQE_MAX_CNT_8192;
 
        sginfo.pgsize = bnxt_qplib_cmdqe_page_size(rcfw->cmdq_depth);
-       hwq_attr.depth = rcfw->cmdq_depth;
+       hwq_attr.depth = rcfw->cmdq_depth & 0x7FFFFFFF;
        hwq_attr.stride = BNXT_QPLIB_CMDQE_UNITS;
        hwq_attr.type = HWQ_TYPE_CTX;
        if (bnxt_qplib_alloc_init_hwq(&cmdq->hwq, &hwq_attr)) {