Commit 6eaf2781 authored by Bert Kenward's avatar Bert Kenward Committed by Bjorn Helgaas

PCI/VPD: Check for VPD access completion before checking for timeout

Previously we checked the timeout before checking the VPD access completion
bit.  On a very heavily loaded system this can cause VPD access to timeout.
Check the completion bit before checking the timeout.
Signed-off-by: default avatarBert Kenward <bkenward@solarflare.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent b72ae8ca
...@@ -146,7 +146,7 @@ static int pci_vpd_wait(struct pci_dev *dev) ...@@ -146,7 +146,7 @@ static int pci_vpd_wait(struct pci_dev *dev)
if (!vpd->busy) if (!vpd->busy)
return 0; return 0;
while (time_before(jiffies, timeout)) { do {
ret = pci_user_read_config_word(dev, vpd->cap + PCI_VPD_ADDR, ret = pci_user_read_config_word(dev, vpd->cap + PCI_VPD_ADDR,
&status); &status);
if (ret < 0) if (ret < 0)
...@@ -160,10 +160,13 @@ static int pci_vpd_wait(struct pci_dev *dev) ...@@ -160,10 +160,13 @@ static int pci_vpd_wait(struct pci_dev *dev)
if (fatal_signal_pending(current)) if (fatal_signal_pending(current))
return -EINTR; return -EINTR;
if (time_after(jiffies, timeout))
break;
usleep_range(10, max_sleep); usleep_range(10, max_sleep);
if (max_sleep < 1024) if (max_sleep < 1024)
max_sleep *= 2; max_sleep *= 2;
} } while (true);
pci_warn(dev, "VPD access failed. This is likely a firmware bug on this device. Contact the card vendor for a firmware update\n"); pci_warn(dev, "VPD access failed. This is likely a firmware bug on this device. Contact the card vendor for a firmware update\n");
return -ETIMEDOUT; return -ETIMEDOUT;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment