On Sat, Oct 05, 2019 at 11:51:29PM +0530, Vidya Sagar wrote: > Adds a 60 seconds timeout to consider CRS (Configuration request Retry > Status) from a downstream device when Vendor ID read is attempted by > an upstream device. This helps to work with devices that return CRS > during system resume. This also makes pci_device_is_present() consistent > with the probe path where 60 seconds timeout is already being used. > > Signed-off-by: Vidya Sagar > --- > drivers/pci/pci.c | 3 ++- > drivers/pci/pci.h | 2 ++ > drivers/pci/probe.c | 2 +- > 3 files changed, 5 insertions(+), 2 deletions(-) I think this makes sense, so: Reviewed-by: Thierry Reding However, it looks like Sinan has researched this extensively in the past and gave a presentation on this at Plumbers in 2017: https://blog.linuxplumbersconf.org/2017/ocw/system/presentations/4732/original/crs.pdf Adding Sinan to see if he has any concerns about this, since resume time is explicitly mentioned in the above slides. Thierry > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > index 95dc78ebdded..3ab9f6d3c8a6 100644 > --- a/drivers/pci/pci.c > +++ b/drivers/pci/pci.c > @@ -5905,7 +5905,8 @@ bool pci_device_is_present(struct pci_dev *pdev) > > if (pci_dev_is_disconnected(pdev)) > return false; > - return pci_bus_read_dev_vendor_id(pdev->bus, pdev->devfn, &v, 0); > + return pci_bus_read_dev_vendor_id(pdev->bus, pdev->devfn, &v, > + PCI_CRS_TIMEOUT); > } > EXPORT_SYMBOL_GPL(pci_device_is_present); > > diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h > index 3f6947ee3324..aa25c5fdc6a5 100644 > --- a/drivers/pci/pci.h > +++ b/drivers/pci/pci.h > @@ -4,6 +4,8 @@ > > #include > > +#define PCI_CRS_TIMEOUT (60 * 1000) /* 60 sec*/ > + > #define PCI_FIND_CAP_TTL 48 > > #define PCI_VSEC_ID_INTEL_TBT 0x1234 /* Thunderbolt */ > diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c > index 7c5d68b807ef..6e44a03283c8 100644 > --- a/drivers/pci/probe.c > +++ b/drivers/pci/probe.c > @@ -2258,7 +2258,7 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn) > struct pci_dev *dev; > u32 l; > > - if (!pci_bus_read_dev_vendor_id(bus, devfn, &l, 60*1000)) > + if (!pci_bus_read_dev_vendor_id(bus, devfn, &l, PCI_CRS_TIMEOUT)) > return NULL; > > dev = pci_alloc_dev(bus); > -- > 2.17.1 >