diff options
| author | Dmitry Torokhov <[email protected]> | 2023-05-01 15:20:08 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-05-01 15:20:08 -0700 | 
| commit | 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e (patch) | |
| tree | d57f3a63479a07b4e0cece029886e76e04feb984 /drivers/net/ethernet/intel/ice/ice_idc.c | |
| parent | 5dc63e56a9cf8df0b59c234a505a1653f1bdf885 (diff) | |
| parent | 53bea86b5712c7491bb3dae12e271666df0a308c (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.4 merge window.
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_idc.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_idc.c | 53 | 
1 files changed, 51 insertions, 2 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_idc.c b/drivers/net/ethernet/intel/ice/ice_idc.c index 895c32bcc8b5..e6bc2285071e 100644 --- a/drivers/net/ethernet/intel/ice/ice_idc.c +++ b/drivers/net/ethernet/intel/ice/ice_idc.c @@ -6,6 +6,8 @@  #include "ice_lib.h"  #include "ice_dcb_lib.h" +static DEFINE_XARRAY_ALLOC1(ice_aux_id); +  /**   * 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,48 @@ 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; +	} + +	ret = xa_alloc(&ice_aux_id, &pf->aux_idx, NULL, XA_LIMIT(1, INT_MAX), +		       GFP_KERNEL); +	if (ret) { +		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; +	xa_erase(&ice_aux_id, 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); +	xa_erase(&ice_aux_id, pf->aux_idx);  }  |