pds_core: Clean up init/uninit flows to be more readable
The setup and teardown flows are somewhat hard to follow regarding pdsc_core_init()/pdsc_dev_init() and their corresponding teardown flows being in pdsc_teardown(). Improve the readability by adding new pdsc_core_uninit()/pdsc_dev_unint() functions that mirror their init counterparts. Also, move the notify and admin qcq allocations into pdsc_core_init(), so they can be freed in pdsc_core_uninit(). Signed-off-by: Brett Creeley <brett.creeley@amd.com> Reviewed-by: Shannon Nelson <shannon.nelson@amd.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
247c4ed033
commit
792d36ccc1
@ -300,6 +300,17 @@ err_out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void pdsc_core_uninit(struct pdsc *pdsc)
|
||||
{
|
||||
pdsc_qcq_free(pdsc, &pdsc->notifyqcq);
|
||||
pdsc_qcq_free(pdsc, &pdsc->adminqcq);
|
||||
|
||||
if (pdsc->kern_dbpage) {
|
||||
iounmap(pdsc->kern_dbpage);
|
||||
pdsc->kern_dbpage = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static int pdsc_core_init(struct pdsc *pdsc)
|
||||
{
|
||||
union pds_core_dev_comp comp = {};
|
||||
@ -310,9 +321,32 @@ static int pdsc_core_init(struct pdsc *pdsc)
|
||||
struct pds_core_dev_init_data_in cidi;
|
||||
u32 dbid_count;
|
||||
u32 dbpage_num;
|
||||
int numdescs;
|
||||
size_t sz;
|
||||
int err;
|
||||
|
||||
/* Scale the descriptor ring length based on number of CPUs and VFs */
|
||||
numdescs = max_t(int, PDSC_ADMINQ_MIN_LENGTH, num_online_cpus());
|
||||
numdescs += 2 * pci_sriov_get_totalvfs(pdsc->pdev);
|
||||
numdescs = roundup_pow_of_two(numdescs);
|
||||
err = pdsc_qcq_alloc(pdsc, PDS_CORE_QTYPE_ADMINQ, 0, "adminq",
|
||||
PDS_CORE_QCQ_F_CORE | PDS_CORE_QCQ_F_INTR,
|
||||
numdescs,
|
||||
sizeof(union pds_core_adminq_cmd),
|
||||
sizeof(union pds_core_adminq_comp),
|
||||
0, &pdsc->adminqcq);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = pdsc_qcq_alloc(pdsc, PDS_CORE_QTYPE_NOTIFYQ, 0, "notifyq",
|
||||
PDS_CORE_QCQ_F_NOTIFYQ,
|
||||
PDSC_NOTIFYQ_LENGTH,
|
||||
sizeof(struct pds_core_notifyq_cmd),
|
||||
sizeof(union pds_core_notifyq_comp),
|
||||
0, &pdsc->notifyqcq);
|
||||
if (err)
|
||||
goto err_out_uninit;
|
||||
|
||||
cidi.adminq_q_base = cpu_to_le64(pdsc->adminqcq.q_base_pa);
|
||||
cidi.adminq_cq_base = cpu_to_le64(pdsc->adminqcq.cq_base_pa);
|
||||
cidi.notifyq_cq_base = cpu_to_le64(pdsc->notifyqcq.cq.base_pa);
|
||||
@ -336,7 +370,7 @@ static int pdsc_core_init(struct pdsc *pdsc)
|
||||
if (err) {
|
||||
dev_err(pdsc->dev, "Device init command failed: %pe\n",
|
||||
ERR_PTR(err));
|
||||
return err;
|
||||
goto err_out_uninit;
|
||||
}
|
||||
|
||||
pdsc->hw_index = le32_to_cpu(cido.core_hw_index);
|
||||
@ -346,7 +380,8 @@ static int pdsc_core_init(struct pdsc *pdsc)
|
||||
pdsc->kern_dbpage = pdsc_map_dbpage(pdsc, dbpage_num);
|
||||
if (!pdsc->kern_dbpage) {
|
||||
dev_err(pdsc->dev, "Cannot map dbpage, aborting\n");
|
||||
return -ENOMEM;
|
||||
err = -ENOMEM;
|
||||
goto err_out_uninit;
|
||||
}
|
||||
|
||||
pdsc->adminqcq.q.hw_type = cido.adminq_hw_type;
|
||||
@ -359,6 +394,10 @@ static int pdsc_core_init(struct pdsc *pdsc)
|
||||
|
||||
pdsc->last_eid = 0;
|
||||
|
||||
return 0;
|
||||
|
||||
err_out_uninit:
|
||||
pdsc_core_uninit(pdsc);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -401,35 +440,12 @@ static int pdsc_viftypes_init(struct pdsc *pdsc)
|
||||
|
||||
int pdsc_setup(struct pdsc *pdsc, bool init)
|
||||
{
|
||||
int numdescs;
|
||||
int err;
|
||||
|
||||
err = pdsc_dev_init(pdsc);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Scale the descriptor ring length based on number of CPUs and VFs */
|
||||
numdescs = max_t(int, PDSC_ADMINQ_MIN_LENGTH, num_online_cpus());
|
||||
numdescs += 2 * pci_sriov_get_totalvfs(pdsc->pdev);
|
||||
numdescs = roundup_pow_of_two(numdescs);
|
||||
err = pdsc_qcq_alloc(pdsc, PDS_CORE_QTYPE_ADMINQ, 0, "adminq",
|
||||
PDS_CORE_QCQ_F_CORE | PDS_CORE_QCQ_F_INTR,
|
||||
numdescs,
|
||||
sizeof(union pds_core_adminq_cmd),
|
||||
sizeof(union pds_core_adminq_comp),
|
||||
0, &pdsc->adminqcq);
|
||||
if (err)
|
||||
goto err_out_teardown;
|
||||
|
||||
err = pdsc_qcq_alloc(pdsc, PDS_CORE_QTYPE_NOTIFYQ, 0, "notifyq",
|
||||
PDS_CORE_QCQ_F_NOTIFYQ,
|
||||
PDSC_NOTIFYQ_LENGTH,
|
||||
sizeof(struct pds_core_notifyq_cmd),
|
||||
sizeof(union pds_core_notifyq_comp),
|
||||
0, &pdsc->notifyqcq);
|
||||
if (err)
|
||||
goto err_out_teardown;
|
||||
|
||||
/* Set up the Core with the AdminQ and NotifyQ info */
|
||||
err = pdsc_core_init(pdsc);
|
||||
if (err)
|
||||
@ -455,35 +471,20 @@ err_out_teardown:
|
||||
|
||||
void pdsc_teardown(struct pdsc *pdsc, bool removing)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!pdsc->pdev->is_virtfn)
|
||||
pdsc_devcmd_reset(pdsc);
|
||||
if (pdsc->adminqcq.work.func)
|
||||
cancel_work_sync(&pdsc->adminqcq.work);
|
||||
pdsc_qcq_free(pdsc, &pdsc->notifyqcq);
|
||||
pdsc_qcq_free(pdsc, &pdsc->adminqcq);
|
||||
|
||||
pdsc_core_uninit(pdsc);
|
||||
|
||||
if (removing) {
|
||||
kfree(pdsc->viftype_status);
|
||||
pdsc->viftype_status = NULL;
|
||||
}
|
||||
|
||||
if (pdsc->intr_info) {
|
||||
for (i = 0; i < pdsc->nintrs; i++)
|
||||
pdsc_intr_free(pdsc, i);
|
||||
pdsc_dev_uninit(pdsc);
|
||||
|
||||
kfree(pdsc->intr_info);
|
||||
pdsc->intr_info = NULL;
|
||||
pdsc->nintrs = 0;
|
||||
}
|
||||
|
||||
if (pdsc->kern_dbpage) {
|
||||
iounmap(pdsc->kern_dbpage);
|
||||
pdsc->kern_dbpage = NULL;
|
||||
}
|
||||
|
||||
pci_free_irq_vectors(pdsc->pdev);
|
||||
set_bit(PDSC_S_FW_DEAD, &pdsc->state);
|
||||
}
|
||||
|
||||
|
@ -282,6 +282,7 @@ int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_core_dev_cmd *cmd,
|
||||
int pdsc_devcmd_init(struct pdsc *pdsc);
|
||||
int pdsc_devcmd_reset(struct pdsc *pdsc);
|
||||
int pdsc_dev_init(struct pdsc *pdsc);
|
||||
void pdsc_dev_uninit(struct pdsc *pdsc);
|
||||
|
||||
void pdsc_reset_prepare(struct pci_dev *pdev);
|
||||
void pdsc_reset_done(struct pci_dev *pdev);
|
||||
|
@ -316,6 +316,22 @@ static int pdsc_identify(struct pdsc *pdsc)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pdsc_dev_uninit(struct pdsc *pdsc)
|
||||
{
|
||||
if (pdsc->intr_info) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < pdsc->nintrs; i++)
|
||||
pdsc_intr_free(pdsc, i);
|
||||
|
||||
kfree(pdsc->intr_info);
|
||||
pdsc->intr_info = NULL;
|
||||
pdsc->nintrs = 0;
|
||||
}
|
||||
|
||||
pci_free_irq_vectors(pdsc->pdev);
|
||||
}
|
||||
|
||||
int pdsc_dev_init(struct pdsc *pdsc)
|
||||
{
|
||||
unsigned int nintrs;
|
||||
|
Loading…
x
Reference in New Issue
Block a user