bnxt_en: refactor cancellation of resource reservations
authorEdwin Peer <edwin.peer@broadcom.com>
Fri, 29 Oct 2021 07:47:39 +0000 (03:47 -0400)
committerDavid S. Miller <davem@davemloft.net>
Fri, 29 Oct 2021 11:13:04 +0000 (12:13 +0100)
Resource reservations will also need to be reset after FUNC_DRV_UNRGTR
in the following devlink driver_reinit patch. Extract this logic into a
reusable function.

Signed-off-by: Edwin Peer <edwin.peer@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h

index 8ff39852548888d9f9409e554baab3b7db8defdf..8471e47d0480b68afc0a313b1e6835bad0c8becc 100644 (file)
@@ -9691,6 +9691,33 @@ static int bnxt_try_recover_fw(struct bnxt *bp)
        return -ENODEV;
 }
 
+int bnxt_cancel_reservations(struct bnxt *bp, bool fw_reset)
+{
+       struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
+       int rc;
+
+       if (!BNXT_NEW_RM(bp))
+               return 0; /* no resource reservations required */
+
+       rc = bnxt_hwrm_func_resc_qcaps(bp, true);
+       if (rc)
+               netdev_err(bp->dev, "resc_qcaps failed\n");
+
+       hw_resc->resv_cp_rings = 0;
+       hw_resc->resv_stat_ctxs = 0;
+       hw_resc->resv_irqs = 0;
+       hw_resc->resv_tx_rings = 0;
+       hw_resc->resv_rx_rings = 0;
+       hw_resc->resv_hw_ring_grps = 0;
+       hw_resc->resv_vnics = 0;
+       if (!fw_reset) {
+               bp->tx_nr_rings = 0;
+               bp->rx_nr_rings = 0;
+       }
+
+       return rc;
+}
+
 static int bnxt_hwrm_if_change(struct bnxt *bp, bool up)
 {
        struct hwrm_func_drv_if_change_output *resp;
@@ -9774,25 +9801,7 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up)
                                return rc;
                        }
                }
-               if (BNXT_NEW_RM(bp)) {
-                       struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
-
-                       rc = bnxt_hwrm_func_resc_qcaps(bp, true);
-                       if (rc)
-                               netdev_err(bp->dev, "resc_qcaps failed\n");
-
-                       hw_resc->resv_cp_rings = 0;
-                       hw_resc->resv_stat_ctxs = 0;
-                       hw_resc->resv_irqs = 0;
-                       hw_resc->resv_tx_rings = 0;
-                       hw_resc->resv_rx_rings = 0;
-                       hw_resc->resv_hw_ring_grps = 0;
-                       hw_resc->resv_vnics = 0;
-                       if (!fw_reset) {
-                               bp->tx_nr_rings = 0;
-                               bp->rx_nr_rings = 0;
-                       }
-               }
+               rc = bnxt_cancel_reservations(bp, fw_reset);
        }
        return rc;
 }
index 55da89cb62b5d4919c4fad4b7ad5e579a526ac5c..5ca4f19936c34a7e6c40c22f7c4e2b2ca6d80273 100644 (file)
@@ -2246,6 +2246,7 @@ void bnxt_tx_enable(struct bnxt *bp);
 int bnxt_update_link(struct bnxt *bp, bool chng_link_state);
 int bnxt_hwrm_set_pause(struct bnxt *);
 int bnxt_hwrm_set_link_setting(struct bnxt *, bool, bool);
+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);