Commit 2b8db6af authored by Michal Swiatkowski's avatar Michal Swiatkowski Committed by Tony Nguyen
Browse files

ice: move RDMA init to ice_idc.c



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: default avatarMichal Swiatkowski <michal.swiatkowski@linux.intel.com>
Acked-by: default avatarDave Ertman <david.m.ertman@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 8065c0e1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
+50 −2
Original line number Diff line number Diff line
@@ -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
@@ -245,6 +247,17 @@ static int ice_reserve_rdma_qvector(struct ice_pf *pf)
	return 0;
}

/**
 * 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);
}
+6 −23
Original line number Diff line number Diff line
@@ -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 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)

	/* 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");
		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);