pds_core: Clean up init/uninit flows to be more readable
authorBrett Creeley <brett.creeley@amd.com>
Fri, 2 Feb 2024 19:59:11 +0000 (11:59 -0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 6 Feb 2024 12:26:54 +0000 (13:26 +0100)
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>
drivers/net/ethernet/amd/pds_core/core.c
drivers/net/ethernet/amd/pds_core/core.h
drivers/net/ethernet/amd/pds_core/dev.c

index 41507ade3570695f97ebd25867f548767a06c8c9..1234a4a8a4aed21acaec7e76ee284da1370a2abf 100644 (file)
@@ -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);
-
-               kfree(pdsc->intr_info);
-               pdsc->intr_info = NULL;
-               pdsc->nintrs = 0;
-       }
-
-       if (pdsc->kern_dbpage) {
-               iounmap(pdsc->kern_dbpage);
-               pdsc->kern_dbpage = NULL;
-       }
+       pdsc_dev_uninit(pdsc);
 
-       pci_free_irq_vectors(pdsc->pdev);
        set_bit(PDSC_S_FW_DEAD, &pdsc->state);
 }
 
index 110c4b826b22d588b33ca5cd2f0f1d38c76cf4b5..3468a63f5ae9a59b57a7df272254dcc621e484a2 100644 (file)
@@ -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);
index 7dc102a311853cfebd07396760b835dd9942abdc..e494e1298dc9a36c175a6b86623450c0da55ad7b 100644 (file)
@@ -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;