Re: [PATCH v2 2/4] PCI: qcom: Do not enumerate bus before endpoint devices are ready

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2025-05-06 at 09:39 +0200, Niklas Cassel wrote:
> Commit 36971d6c5a9a ("PCI: qcom: Don't wait for link if we can detect
> Link
> Up") changed so that we no longer call dw_pcie_wait_for_link(), and
> instead
> enumerate the bus when receiving a Link Up IRQ.
> 
> Before 36971d6c5a9a, we called dw_pcie_wait_for_link(), and in the
> first
> iteration of the loop, the link will never be up (because the link
> was just
> started), dw_pcie_wait_for_link() will then sleep for
> LINK_WAIT_SLEEP_MS
> (90 ms), before trying again.
> 
> This means that even if a driver was missing a
> msleep(PCIE_T_RRS_READY_MS)
> (100 ms), because of the call to dw_pcie_wait_for_link(), enumerating
> the
> bus would essentially be delayed by that time anyway (because of the
> sleep
> LINK_WAIT_SLEEP_MS (90 ms)).
> 
> While we could add the msleep(PCIE_T_RRS_READY_MS) after deasserting
> PERST
> (qcom already has an unconditional 1 ms sleep after deasserting
> PERST),
> that would essentially bring back an unconditional delay during probe
> (the
> whole reason to use a Link Up IRQ was to avoid an unconditional delay
> during probe).
> 
> Thus, add the msleep(PCIE_T_RRS_READY_MS) before enumerating the bus
> in the
> IRQ handler. This way, for qcom SoCs that has a link up IRQ, we will
> not
> have a 100 ms unconditional delay during boot for unpopulated PCIe
> slots.
> 
> Fixes: 36971d6c5a9a ("PCI: qcom: Don't wait for link if we can detect
> Link Up")
> Signed-off-by: Niklas Cassel <cassel@xxxxxxxxxx>
> ---
>  drivers/pci/controller/dwc/pcie-qcom.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/pci/controller/dwc/pcie-qcom.c
> b/drivers/pci/controller/dwc/pcie-qcom.c
> index dc98ae63362d..01a60d1f372a 100644
> --- a/drivers/pci/controller/dwc/pcie-qcom.c
> +++ b/drivers/pci/controller/dwc/pcie-qcom.c
> @@ -1565,6 +1565,7 @@ static irqreturn_t
> qcom_pcie_global_irq_thread(int irq, void *data)
>  
>  	if (FIELD_GET(PARF_INT_ALL_LINK_UP, status)) {
>  		dev_dbg(dev, "Received Link up event. Starting
> enumeration!\n");
> +		msleep(PCIE_T_RRS_READY_MS);
>  		/* Rescan the bus to enumerate endpoint devices */
>  		pci_lock_rescan_remove();
>  		pci_rescan_bus(pp->bridge->bus);
Reviewed-by: Wilfred Mallawa <wilfred.mallawa@xxxxxxx>




[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux