On Mon, Aug 12, 2019 at 03:24:52PM +0800, Rick Tseng wrote: > From: Rick <rtseng@xxxxxxxxxx> > > NVIDIA 3.1 xHCI card would lose power when moving power state into D3Cold. > Thus we need to wait CNR bit to clear when xhci resmue as xhci init. > > Signed-off-by: Rick <rtseng@xxxxxxxxxx> We need a "full" name on the from and signed-off-by lines, please. > --- > drivers/usb/host/xhci-pci.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c > index 1e0236e..857ad8a 100644 > --- a/drivers/usb/host/xhci-pci.c > +++ b/drivers/usb/host/xhci-pci.c > @@ -12,6 +12,7 @@ > #include <linux/slab.h> > #include <linux/module.h> > #include <linux/acpi.h> > +#include <linux/iopoll.h> > > #include "xhci.h" > #include "xhci-trace.h" > @@ -455,6 +456,19 @@ static void xhci_pme_quirk(struct usb_hcd *hcd) > readl(reg); > } > > +static int xhci_poll_cnr(struct usb_hcd *hcd) > +{ > + struct xhci_hcd *xhci = hcd_to_xhci(hcd); > + void __iomem *reg = &xhci->op_regs->status; > + u32 result; > + int ret; > + > + ret = readl_poll_timeout_atomic(reg, result, > + (result & STS_CNR) == 0, > + 1, 100 * 1000); > + return ret; > +} > + > static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) > { > struct xhci_hcd *xhci = hcd_to_xhci(hcd); > @@ -508,6 +522,12 @@ static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated) > if (pdev->vendor == PCI_VENDOR_ID_INTEL) > usb_enable_intel_xhci_ports(pdev); > > + if (pdev->vendor == PCI_VENDOR_ID_NVIDIA) { So all devices of this vendor need that? Are you _sure_? Why not just blacklist a single device? thanks, greg k-h