diff options
| author | Ajay Agarwal <[email protected]> | 2023-04-12 09:34:25 +0000 |
|---|---|---|
| committer | Lorenzo Pieralisi <[email protected]> | 2023-05-26 08:45:12 +0000 |
| commit | da56a1bfbab55189595e588f1d984bdfb5cf5924 (patch) | |
| tree | 3b6bc5e11ca564f1349019af3e3d688da6866b70 /drivers/pci/controller/dwc/pcie-designware-host.c | |
| parent | Linux 6.4-rc1 (diff) | |
| download | kernel-da56a1bfbab55189595e588f1d984bdfb5cf5924.tar.gz kernel-da56a1bfbab55189595e588f1d984bdfb5cf5924.zip | |
PCI: dwc: Wait for link up only if link is started
In dw_pcie_host_init() regardless of whether the link has been
started or not, the code waits for the link to come up. Even in
cases where start_link() is not defined the code ends up spinning
in a loop for 1 second. Since in some systems dw_pcie_host_init()
gets called during probe, this one second loop for each pcie
interface instance ends up extending the boot time.
Wait for the link up in only if the start_link() is defined.
Link: https://lore.kernel.org/r/[email protected]
Tested-by: Will McVicker <[email protected]>
Signed-off-by: Sajid Dalvi <[email protected]>
Signed-off-by: Ajay Agarwal <[email protected]>
Signed-off-by: Lorenzo Pieralisi <[email protected]>
Diffstat (limited to 'drivers/pci/controller/dwc/pcie-designware-host.c')
| -rw-r--r-- | drivers/pci/controller/dwc/pcie-designware-host.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c index 9952057c8819..cf61733bf78d 100644 --- a/drivers/pci/controller/dwc/pcie-designware-host.c +++ b/drivers/pci/controller/dwc/pcie-designware-host.c @@ -485,14 +485,19 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp) if (ret) goto err_remove_edma; - if (!dw_pcie_link_up(pci)) { + if (dw_pcie_link_up(pci)) { + dw_pcie_print_link_status(pci); + } else { ret = dw_pcie_start_link(pci); if (ret) goto err_remove_edma; - } - /* Ignore errors, the link may come up later */ - dw_pcie_wait_for_link(pci); + if (pci->ops && pci->ops->start_link) { + ret = dw_pcie_wait_for_link(pci); + if (ret) + goto err_stop_link; + } + } bridge->sysdata = pp; |
