bnxt_en: reclaim max resources if sriov enable fails
authorKashyap Desai <kashyap.desai@broadcom.com>
Tue, 12 Jul 2022 02:26:14 +0000 (22:26 -0400)
committerJakub Kicinski <kuba@kernel.org>
Wed, 13 Jul 2022 03:35:54 +0000 (20:35 -0700)
If bnxt_sriov_enable() fails after some resources have been reserved
for the VFs, the current code is not unwinding properly and the
reserved resources become unavailable afterwards.  Fix it by
properly unwinding with a call to bnxt_hwrm_func_qcaps() to
reset all maximum resources.

Also, add the missing bnxt_ulp_sriov_cfg() call to let the RDMA
driver know to abort.

Fixes: c0c050c58d84 ("bnxt_en: New Broadcom ethernet driver.")
Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c

index 56b46b8..7ba181c 100644 (file)
@@ -7790,7 +7790,7 @@ hwrm_dbg_qcaps_exit:
 
 static int bnxt_hwrm_queue_qportcfg(struct bnxt *bp);
 
-static int bnxt_hwrm_func_qcaps(struct bnxt *bp)
+int bnxt_hwrm_func_qcaps(struct bnxt *bp)
 {
        int rc;
 
index a1dca8c..075c620 100644 (file)
@@ -2314,6 +2314,7 @@ int bnxt_cancel_reservations(struct bnxt *bp, bool fw_reset);
 int bnxt_hwrm_alloc_wol_fltr(struct bnxt *bp);
 int bnxt_hwrm_free_wol_fltr(struct bnxt *bp);
 int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp, bool all);
+int bnxt_hwrm_func_qcaps(struct bnxt *bp);
 int bnxt_hwrm_fw_set_time(struct bnxt *);
 int bnxt_open_nic(struct bnxt *, bool, bool);
 int bnxt_half_open_nic(struct bnxt *bp);
index ddf2f39..a1a2c7a 100644 (file)
@@ -823,8 +823,10 @@ static int bnxt_sriov_enable(struct bnxt *bp, int *num_vfs)
                goto err_out2;
 
        rc = pci_enable_sriov(bp->pdev, *num_vfs);
-       if (rc)
+       if (rc) {
+               bnxt_ulp_sriov_cfg(bp, 0);
                goto err_out2;
+       }
 
        return 0;
 
@@ -832,6 +834,9 @@ err_out2:
        /* Free the resources reserved for various VF's */
        bnxt_hwrm_func_vf_resource_free(bp, *num_vfs);
 
+       /* Restore the max resources */
+       bnxt_hwrm_func_qcaps(bp);
+
 err_out1:
        bnxt_free_vf_resources(bp);