lkml.org 
[lkml]   [2022]   [Jun]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 01/18] PCI: dwc: Stop link in the host init error and de-initialization
    Date
    It's logically correct to undo everything what was done in case of an
    error is discovered or in the corresponding cleanup counterpart. Otherwise
    the host controller will be left in an undetermined state. Seeing the link
    is set up in the Host-initialization method it will be right to
    de-activate it there in the cleanup-on-error block and stop the link in
    the antagonistic routine - dw_pcie_host_deinit(). The link de-activation
    is a platform-specific thing and is supposed to be implemented in the
    framework of the dw_pcie_ops.stop_link() operation.

    Fixes: 886a9c134755 ("PCI: dwc: Move link handling into common code")
    Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
    Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
    Tested-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
    Reviewed-by: Rob Herring <robh@kernel.org>
    ---
    .../pci/controller/dwc/pcie-designware-host.c | 16 ++++++++++++++--
    1 file changed, 14 insertions(+), 2 deletions(-)

    diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
    index 2fa86f32d964..7403b1709726 100644
    --- a/drivers/pci/controller/dwc/pcie-designware-host.c
    +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
    @@ -420,8 +420,14 @@ int dw_pcie_host_init(struct pcie_port *pp)
    bridge->sysdata = pp;

    ret = pci_host_probe(bridge);
    - if (!ret)
    - return 0;
    + if (ret)
    + goto err_stop_link;
    +
    + return 0;
    +
    +err_stop_link:
    + if (pci->ops && pci->ops->stop_link)
    + pci->ops->stop_link(pci);

    err_free_msi:
    if (pp->has_msi_ctrl)
    @@ -432,8 +438,14 @@ EXPORT_SYMBOL_GPL(dw_pcie_host_init);

    void dw_pcie_host_deinit(struct pcie_port *pp)
    {
    + struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
    +
    pci_stop_root_bus(pp->bridge->bus);
    pci_remove_root_bus(pp->bridge->bus);
    +
    + if (pci->ops && pci->ops->stop_link)
    + pci->ops->stop_link(pci);
    +
    if (pp->has_msi_ctrl)
    dw_pcie_free_msi(pp);
    }
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-06-10 10:28    [W:7.505 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site