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

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
...@@ -907,6 +907,7 @@ void ice_print_link_msg(struct ice_vsi *vsi, bool isup); ...@@ -907,6 +907,7 @@ void ice_print_link_msg(struct ice_vsi *vsi, bool isup);
int ice_plug_aux_dev(struct ice_pf *pf); int ice_plug_aux_dev(struct ice_pf *pf);
void ice_unplug_aux_dev(struct ice_pf *pf); void ice_unplug_aux_dev(struct ice_pf *pf);
int ice_init_rdma(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); const char *ice_aq_str(enum ice_aq_err aq_err);
bool ice_is_wol_supported(struct ice_hw *hw); bool ice_is_wol_supported(struct ice_hw *hw);
void ice_fdir_del_all_fltrs(struct ice_vsi *vsi); void ice_fdir_del_all_fltrs(struct ice_vsi *vsi);
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include "ice_lib.h" #include "ice_lib.h"
#include "ice_dcb_lib.h" #include "ice_dcb_lib.h"
static DEFINE_IDA(ice_aux_ida);
/** /**
* ice_get_auxiliary_drv - retrieve iidc_auxiliary_drv struct * ice_get_auxiliary_drv - retrieve iidc_auxiliary_drv struct
* @pf: pointer to PF struct * @pf: pointer to PF struct
...@@ -245,6 +247,17 @@ static int ice_reserve_rdma_qvector(struct ice_pf *pf) ...@@ -245,6 +247,17 @@ static int ice_reserve_rdma_qvector(struct ice_pf *pf)
return 0; 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 * ice_adev_release - function to be mapped to AUX dev's release op
* @dev: pointer to device to free * @dev: pointer to device to free
...@@ -331,12 +344,47 @@ int ice_init_rdma(struct ice_pf *pf) ...@@ -331,12 +344,47 @@ int ice_init_rdma(struct ice_pf *pf)
struct device *dev = &pf->pdev->dev; struct device *dev = &pf->pdev->dev;
int ret; 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 */ /* Reserve vector resources */
ret = ice_reserve_rdma_qvector(pf); ret = ice_reserve_rdma_qvector(pf);
if (ret < 0) { if (ret < 0) {
dev_err(dev, "failed to reserve vectors for RDMA\n"); dev_err(dev, "failed to reserve vectors for RDMA\n");
return ret; goto err_reserve_rdma_qvector;
} }
pf->rdma_mode |= IIDC_RDMA_PROTOCOL_ROCEV2; 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);
} }
...@@ -44,7 +44,6 @@ MODULE_PARM_DESC(debug, "netif level (0=none,...,16=all), hw debug_mask (0x8XXXX ...@@ -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)"); MODULE_PARM_DESC(debug, "netif level (0=none,...,16=all)");
#endif /* !CONFIG_DYNAMIC_DEBUG */ #endif /* !CONFIG_DYNAMIC_DEBUG */
static DEFINE_IDA(ice_aux_ida);
DEFINE_STATIC_KEY_FALSE(ice_xdp_locking_key); DEFINE_STATIC_KEY_FALSE(ice_xdp_locking_key);
EXPORT_SYMBOL(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) ...@@ -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 */ /* ready to go, so clear down state bit */
clear_bit(ICE_DOWN, pf->state); clear_bit(ICE_DOWN, pf->state);
if (ice_is_rdma_ena(pf)) { err = ice_init_rdma(pf);
pf->aux_idx = ida_alloc(&ice_aux_ida, GFP_KERNEL); if (err) {
if (pf->aux_idx < 0) { dev_err(dev, "Failed to initialize RDMA: %d\n", err);
dev_err(dev, "Failed to allocate device ID for AUX driver\n"); err = -EIO;
err = -ENOMEM; goto err_devlink_reg_param;
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");
} }
ice_devlink_register(pf); ice_devlink_register(pf);
return 0; return 0;
err_init_aux_unroll:
pf->adev = NULL;
ida_free(&ice_aux_ida, pf->aux_idx);
err_devlink_reg_param: err_devlink_reg_param:
ice_devlink_unregister_params(pf); ice_devlink_unregister_params(pf);
err_netdev_reg: err_netdev_reg:
...@@ -5075,9 +5060,7 @@ static void ice_remove(struct pci_dev *pdev) ...@@ -5075,9 +5060,7 @@ static void ice_remove(struct pci_dev *pdev)
ice_service_task_stop(pf); ice_service_task_stop(pf);
ice_aq_cancel_waiting_tasks(pf); ice_aq_cancel_waiting_tasks(pf);
ice_unplug_aux_dev(pf); ice_deinit_rdma(pf);
if (pf->aux_idx >= 0)
ida_free(&ice_aux_ida, pf->aux_idx);
ice_devlink_unregister_params(pf); ice_devlink_unregister_params(pf);
set_bit(ICE_DOWN, pf->state); set_bit(ICE_DOWN, pf->state);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment