On Fri, Jun 24, 2022 at 05:39:40PM +0300, Serge Semin wrote: > Seeing the platform-specific DW PCIe host-initialization is performed from > within the generic dw_pcie_host_init() method by means of the dedicated > dw_pcie_ops.host_init() callback, there must be declared an antagonist > which would perform the corresponding cleanups. Let's add such callback > then. It will be called in the dw_pcie_host_deinit() method and in the > cleanup-on-error path in the dw_pcie_host_init() function. > > Signed-off-by: Serge Semin <Sergey.Semin@xxxxxxxxxxxxxxxxxxxx> Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@xxxxxxxxxx> Thanks, Mani > --- > .../pci/controller/dwc/pcie-designware-host.c | 21 ++++++++++++++----- > drivers/pci/controller/dwc/pcie-designware.h | 1 + > 2 files changed, 17 insertions(+), 5 deletions(-) > > diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c > index b1437b37140f..4f984c845b59 100644 > --- a/drivers/pci/controller/dwc/pcie-designware-host.c > +++ b/drivers/pci/controller/dwc/pcie-designware-host.c > @@ -354,13 +354,14 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp) > pp->num_vectors = MSI_DEF_NUM_VECTORS; > } else if (pp->num_vectors > MAX_MSI_IRQS) { > dev_err(dev, "Invalid number of vectors\n"); > - return -EINVAL; > + ret = -EINVAL; > + goto err_deinit_host; > } > > if (pp->ops->msi_host_init) { > ret = pp->ops->msi_host_init(pp); > if (ret < 0) > - return ret; > + goto err_deinit_host; > } else if (pp->has_msi_ctrl) { > u32 ctrl, num_ctrls; > > @@ -372,8 +373,10 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp) > pp->msi_irq = platform_get_irq_byname_optional(pdev, "msi"); > if (pp->msi_irq < 0) { > pp->msi_irq = platform_get_irq(pdev, 0); > - if (pp->msi_irq < 0) > - return pp->msi_irq; > + if (pp->msi_irq < 0) { > + ret = pp->msi_irq; > + goto err_deinit_host; > + } > } > } > > @@ -381,7 +384,7 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp) > > ret = dw_pcie_allocate_domains(pp); > if (ret) > - return ret; > + goto err_deinit_host; > > if (pp->msi_irq > 0) > irq_set_chained_handler_and_data(pp->msi_irq, > @@ -434,6 +437,11 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp) > err_free_msi: > if (pp->has_msi_ctrl) > dw_pcie_free_msi(pp); > + > +err_deinit_host: > + if (pp->ops->host_deinit) > + pp->ops->host_deinit(pp); > + > return ret; > } > EXPORT_SYMBOL_GPL(dw_pcie_host_init); > @@ -449,6 +457,9 @@ void dw_pcie_host_deinit(struct dw_pcie_rp *pp) > > if (pp->has_msi_ctrl) > dw_pcie_free_msi(pp); > + > + if (pp->ops->host_deinit) > + pp->ops->host_deinit(pp); > } > EXPORT_SYMBOL_GPL(dw_pcie_host_deinit); > > diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h > index d247f227464c..7f1c00fa084d 100644 > --- a/drivers/pci/controller/dwc/pcie-designware.h > +++ b/drivers/pci/controller/dwc/pcie-designware.h > @@ -200,6 +200,7 @@ enum dw_pcie_device_mode { > > struct dw_pcie_host_ops { > int (*host_init)(struct dw_pcie_rp *pp); > + void (*host_deinit)(struct dw_pcie_rp *pp); > int (*msi_host_init)(struct dw_pcie_rp *pp); > }; > > -- > 2.35.1 > -- மணிவண்ணன் சதாசிவம்