Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -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)
		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;