Skip to content

Commit

Permalink
PCI: Use pcie_wait_for_link_status() in pcie_wait_for_link_delay()
Browse files Browse the repository at this point in the history
Remove a DLLLA status bit polling loop from pcie_wait_for_link_delay() and
call almost identical code in pcie_wait_for_link_status() instead.  This
reduces the lower bound on the polling interval from 10ms to 1ms, possibly
increasing the CPU load on the system in favour to reducing the wait time.

Link: https://lore.kernel.org/r/alpine.DEB.2.21.2306111611170.64925@angie.orcam.me.uk
Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
  • Loading branch information
Maciej W. Rozycki authored and Bjorn Helgaas committed Jun 20, 2023
1 parent 680e9c4 commit 7604bc2
Showing 1 changed file with 3 additions and 14 deletions.
17 changes: 3 additions & 14 deletions drivers/pci/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -4928,16 +4928,14 @@ bool pcie_retrain_link(struct pci_dev *pdev, bool use_lt)
static bool pcie_wait_for_link_delay(struct pci_dev *pdev, bool active,
int delay)
{
int timeout = PCIE_LINK_RETRAIN_TIMEOUT_MS;
bool ret;
u16 lnk_status;

/*
* Some controllers might not implement link active reporting. In this
* case, we wait for 1000 ms + any delay requested by the caller.
*/
if (!pdev->link_active_reporting) {
msleep(timeout + delay);
msleep(PCIE_LINK_RETRAIN_TIMEOUT_MS + delay);
return true;
}

Expand All @@ -4952,20 +4950,11 @@ static bool pcie_wait_for_link_delay(struct pci_dev *pdev, bool active,
*/
if (active)
msleep(20);
for (;;) {
pcie_capability_read_word(pdev, PCI_EXP_LNKSTA, &lnk_status);
ret = !!(lnk_status & PCI_EXP_LNKSTA_DLLLA);
if (ret == active)
break;
if (timeout <= 0)
break;
msleep(10);
timeout -= 10;
}
ret = pcie_wait_for_link_status(pdev, false, active);
if (active && ret)
msleep(delay);

return ret == active;
return ret;
}

/**
Expand Down

0 comments on commit 7604bc2

Please sign in to comment.