summaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
authorSinan Kaya <okaya@codeaurora.org>2017-08-29 21:45:44 +0200
committerBjorn Helgaas <bhelgaas@google.com>2017-08-29 21:45:44 +0200
commit62bc6a6f7468bc6d6cb39177504e79df401aea76 (patch)
tree0d53c180be8a502c7f8d0db3d23184346b37d162 /drivers/pci
parentPCI: Always check for non-CRS response before timeout (diff)
downloadlinux-62bc6a6f7468bc6d6cb39177504e79df401aea76.tar.xz
linux-62bc6a6f7468bc6d6cb39177504e79df401aea76.zip
PCI: Add pci_bus_crs_vendor_id() to detect CRS response data
Add pci_bus_crs_vendor_id() to determine whether data returned for a config read of the Vendor ID indicates a Configuration Request Retry Status (CRS) response. Per PCIe r3.1, sec 2.3.2, this data is only returned if: - CRS Software Visibility is enabled, - a config read includes both bytes of the Vendor ID, and - the read receives a CRS completion Signed-off-by: Sinan Kaya <okaya@codeaurora.org> [bhelgaas: changelog, change name to pci_bus_crs_vendor_id(), make static in probe.c, use it in pci_bus_read_dev_vendor_id()] Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/probe.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 150093817c59..5e001bbc2392 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1853,6 +1853,11 @@ struct pci_dev *pci_alloc_dev(struct pci_bus *bus)
}
EXPORT_SYMBOL(pci_alloc_dev);
+static bool pci_bus_crs_vendor_id(u32 l)
+{
+ return (l & 0xffff) == 0x0001;
+}
+
bool pci_bus_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *l,
int crs_timeout)
{
@@ -1872,7 +1877,7 @@ bool pci_bus_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *l,
* by the PCIe spec. Ignore the device ID and only check for
* (vendor id == 1).
*/
- while ((*l & 0xffff) == 0x0001) {
+ while (pci_bus_crs_vendor_id(*l)) {
if (!crs_timeout)
return false;