ice: move RDMA init to ice_idc.c
authorMichal Swiatkowski <michal.swiatkowski@linux.intel.com>
Wed, 21 Dec 2022 11:38:13 +0000 (12:38 +0100)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Fri, 3 Feb 2023 17:54:18 +0000 (09:54 -0800)
Simplify probe flow by moving all RDMA related code to ice_init_rdma().
Unroll irq allocation if RDMA initialization fails.

Implement ice_deinit_rdma() and use it in remove flow.

Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Acked-by: Dave Ertman <david.m.ertman@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice.h
drivers/net/ethernet/intel/ice/ice_idc.c
drivers/net/ethernet/intel/ice/ice_main.c

index 3d26ff4..e8558c0 100644 (file)
@@ -907,6 +907,7 @@ void ice_print_link_msg(struct ice_vsi *vsi, bool isup);
 int ice_plug_aux_dev(struct ice_pf *pf);
 void ice_unplug_aux_dev(struct ice_pf *pf);
 int ice_init_rdma(struct ice_pf *pf);
+void ice_deinit_rdma(struct ice_pf *pf);
 const char *ice_aq_str(enum ice_aq_err aq_err);
 bool ice_is_wol_supported(struct ice_hw *hw);
 void ice_fdir_del_all_fltrs(struct ice_vsi *vsi);
index 895c32b..579d2a4 100644 (file)
@@ -6,6 +6,8 @@
 #include "ice_lib.h"
 #include "ice_dcb_lib.h"
 
+static DEFINE_IDA(ice_aux_ida);
+
 /**
  * ice_get_auxiliary_drv - retrieve iidc_auxiliary_drv struct
  * @pf: pointer to PF struct
@@ -246,6 +248,17 @@ static int ice_reserve_rdma_qvector(struct ice_pf *pf)
 }
 
 /**
+ * ice_free_rdma_qvector - free vector resources reserved for RDMA driver
+ * @pf: board private structure to initialize
+ */
+static void ice_free_rdma_qvector(struct ice_pf *pf)
+{
+       pf->num_avail_sw_msix -= pf->num_rdma_msix;
+       ice_free_res(pf->irq_tracker, pf->rdma_base_vector,
+                    ICE_RES_RDMA_VEC_ID);
+}
+
+/**
  * ice_adev_release - function to be mapped to AUX dev's release op
  * @dev: pointer to device to free
  */
@@ -331,12 +344,47 @@ int ice_init_rdma(struct ice_pf *pf)
        struct device *dev = &pf->pdev->dev;
        int ret;
 
+       if (!ice_is_rdma_ena(pf)) {
+               dev_warn(dev, "RDMA is not supported on this device\n");
+               return 0;
+       }
+
+       pf->aux_idx = ida_alloc(&ice_aux_ida, GFP_KERNEL);
+       if (pf->aux_idx < 0) {
+               dev_err(dev, "Failed to allocate device ID for AUX driver\n");
+               return -ENOMEM;
+       }
+
        /* Reserve vector resources */
        ret = ice_reserve_rdma_qvector(pf);
        if (ret < 0) {
                dev_err(dev, "failed to reserve vectors for RDMA\n");
-               return ret;
+               goto err_reserve_rdma_qvector;
        }
        pf->rdma_mode |= IIDC_RDMA_PROTOCOL_ROCEV2;
-       return ice_plug_aux_dev(pf);
+       ret = ice_plug_aux_dev(pf);
+       if (ret)
+               goto err_plug_aux_dev;
+       return 0;
+
+err_plug_aux_dev:
+       ice_free_rdma_qvector(pf);
+err_reserve_rdma_qvector:
+       pf->adev = NULL;
+       ida_free(&ice_aux_ida, pf->aux_idx);
+       return ret;
+}
+
+/**
+ * ice_deinit_rdma - deinitialize RDMA on PF
+ * @pf: ptr to ice_pf
+ */
+void ice_deinit_rdma(struct ice_pf *pf)
+{
+       if (!ice_is_rdma_ena(pf))
+               return;
+
+       ice_unplug_aux_dev(pf);
+       ice_free_rdma_qvector(pf);
+       ida_free(&ice_aux_ida, pf->aux_idx);
 }
index 22b8ad0..3846790 100644 (file)
@@ -44,7 +44,6 @@ MODULE_PARM_DESC(debug, "netif level (0=none,...,16=all), hw debug_mask (0x8XXXX
 MODULE_PARM_DESC(debug, "netif level (0=none,...,16=all)");
 #endif /* !CONFIG_DYNAMIC_DEBUG */
 
-static DEFINE_IDA(ice_aux_ida);
 DEFINE_STATIC_KEY_FALSE(ice_xdp_locking_key);
 EXPORT_SYMBOL(ice_xdp_locking_key);
 
@@ -4932,30 +4931,16 @@ probe_done:
 
        /* ready to go, so clear down state bit */
        clear_bit(ICE_DOWN, pf->state);
-       if (ice_is_rdma_ena(pf)) {
-               pf->aux_idx = ida_alloc(&ice_aux_ida, GFP_KERNEL);
-               if (pf->aux_idx < 0) {
-                       dev_err(dev, "Failed to allocate device ID for AUX driver\n");
-                       err = -ENOMEM;
-                       goto err_devlink_reg_param;
-               }
-
-               err = ice_init_rdma(pf);
-               if (err) {
-                       dev_err(dev, "Failed to initialize RDMA: %d\n", err);
-                       err = -EIO;
-                       goto err_init_aux_unroll;
-               }
-       } else {
-               dev_warn(dev, "RDMA is not supported on this device\n");
+       err = ice_init_rdma(pf);
+       if (err) {
+               dev_err(dev, "Failed to initialize RDMA: %d\n", err);
+               err = -EIO;
+               goto err_devlink_reg_param;
        }
 
        ice_devlink_register(pf);
        return 0;
 
-err_init_aux_unroll:
-       pf->adev = NULL;
-       ida_free(&ice_aux_ida, pf->aux_idx);
 err_devlink_reg_param:
        ice_devlink_unregister_params(pf);
 err_netdev_reg:
@@ -5075,9 +5060,7 @@ static void ice_remove(struct pci_dev *pdev)
        ice_service_task_stop(pf);
 
        ice_aq_cancel_waiting_tasks(pf);
-       ice_unplug_aux_dev(pf);
-       if (pf->aux_idx >= 0)
-               ida_free(&ice_aux_ida, pf->aux_idx);
+       ice_deinit_rdma(pf);
        ice_devlink_unregister_params(pf);
        set_bit(ICE_DOWN, pf->state);