]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RDMA/bng_re: Fix silent failure in HWRM version query
authorKamal Heib <kheib@redhat.com>
Tue, 3 Mar 2026 04:36:45 +0000 (23:36 -0500)
committerLeon Romanovsky <leon@kernel.org>
Thu, 5 Mar 2026 09:34:31 +0000 (04:34 -0500)
If the firmware version query fails, the driver currently ignores the
error and continues initializing. This leaves the device in a bad state.

Fix this by making bng_re_query_hwrm_version() return the error code and
update the driver to check for this error and stop the setup process
safely if it happens.

Fixes: 745065770c2d ("RDMA/bng_re: Register and get the resources from bnge driver")
Signed-off-by: Kamal Heib <kheib@redhat.com>
Link: https://patch.msgid.link/20260303043645.425724-1-kheib@redhat.com
Reviewed-by: Siva Reddy Kallam <siva.kallam@broadcom.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/bng_re/bng_dev.c

index d34b5f88cd40b4c378078950bf15aa32fb6f3c4a..71a7ca2196ad883204a4304b37a34274727f20b7 100644 (file)
@@ -210,7 +210,7 @@ static int bng_re_stats_ctx_alloc(struct bng_re_dev *rdev)
        return rc;
 }
 
-static void bng_re_query_hwrm_version(struct bng_re_dev *rdev)
+static int bng_re_query_hwrm_version(struct bng_re_dev *rdev)
 {
        struct bnge_auxr_dev *aux_dev = rdev->aux_dev;
        struct hwrm_ver_get_output ver_get_resp = {};
@@ -230,7 +230,7 @@ static void bng_re_query_hwrm_version(struct bng_re_dev *rdev)
        if (rc) {
                ibdev_err(&rdev->ibdev, "Failed to query HW version, rc = 0x%x",
                          rc);
-               return;
+               return rc;
        }
 
        cctx = rdev->chip_ctx;
@@ -244,6 +244,8 @@ static void bng_re_query_hwrm_version(struct bng_re_dev *rdev)
 
        if (!cctx->hwrm_cmd_max_timeout)
                cctx->hwrm_cmd_max_timeout = BNG_ROCE_FW_MAX_TIMEOUT;
+
+       return 0;
 }
 
 static void bng_re_dev_uninit(struct bng_re_dev *rdev)
@@ -306,13 +308,15 @@ static int bng_re_dev_init(struct bng_re_dev *rdev)
                goto msix_ctx_fail;
        }
 
-       bng_re_query_hwrm_version(rdev);
+       rc = bng_re_query_hwrm_version(rdev);
+       if (rc)
+               goto destroy_chip_ctx;
 
        rc = bng_re_alloc_fw_channel(&rdev->bng_res, &rdev->rcfw);
        if (rc) {
                ibdev_err(&rdev->ibdev,
                          "Failed to allocate RCFW Channel: %#x\n", rc);
-               goto alloc_fw_chl_fail;
+               goto destroy_chip_ctx;
        }
 
        /* Allocate nq record memory */
@@ -391,7 +395,7 @@ free_rcfw:
        kfree(rdev->nqr);
 nq_alloc_fail:
        bng_re_free_rcfw_channel(&rdev->rcfw);
-alloc_fw_chl_fail:
+destroy_chip_ctx:
        bng_re_destroy_chip_ctx(rdev);
 msix_ctx_fail:
        bnge_unregister_dev(rdev->aux_dev);