Re: [PATCH] xhci: Fix spurious wakeups after S5 on Haswell (v3)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Takashi,

You've added the PCI device IDs of the xHCI LPT and LPT-LP to pci_ids.h.
AFAIK, the xHCI driver is the only driver to use it, and I thought the
rule was that we would only add the device IDs to pci_ids.h if more than
one driver used it.

Wouldn't it make sense to avoid polluting pci_ids.h and move the device
IDs to xhci-pci.c?

Also, you've got version numbers in the subject line, and version info
in the patch body.  I was just going to clean that up until I noticed
the pci_ids.h issue.

Sarah Sharp

On Wed, Sep 11, 2013 at 02:43:24PM +0200, Takashi Iwai wrote:
> Haswell LynxPoint and LynxPoint-LP with the recent Intel BIOS show
> mysterious wakeups after shutdown occasionally.  After discussing with
> BIOS engineers, they explained that the new BIOS expects that the
> wakeup sources are cleared and set to D3 for all wakeup devices when
> the system is going to sleep or power off, but the current xhci driver
> doesn't do this properly (partly intentionally).
> 
> This patch introduces a new quirk, XHCI_HSW_SPURIOUS_WAKEUP, for
> fixing the spurious wakeups at S5 by calling xhci_reset() in the xhci
> shutdown ops as done in xhci_stop(), and setting the device to PCI D3
> at shutdown and remove ops.
> 
> The PCI D3 call is based on the initial fix patch by Oliver Neukum.
> 
> v1->v2: forgot to refresh the patch before submission
> v2->v3: reduce the workaround, just call xhci_reset(); also use D3hot
> 
> Cc: Oliver Neukum <oneukum@xxxxxxx>
> Signed-off-by: Takashi Iwai <tiwai@xxxxxxx>
> ---
>  drivers/usb/host/xhci-pci.c | 14 ++++++++++++++
>  drivers/usb/host/xhci.c     |  7 +++++++
>  drivers/usb/host/xhci.h     |  1 +
>  include/linux/pci_ids.h     |  2 ++
>  4 files changed, 24 insertions(+)
> 
> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
> index c2d4950..52fa71e 100644
> --- a/drivers/usb/host/xhci-pci.c
> +++ b/drivers/usb/host/xhci-pci.c
> @@ -110,6 +110,15 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
>  		xhci->quirks |= XHCI_SPURIOUS_REBOOT;
>  		xhci->quirks |= XHCI_AVOID_BEI;
>  	}
> +	if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
> +	    (pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_XHCI ||
> +	     pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI)) {
> +		/* Workaround for occasional spurious wakeups from S5 (or
> +		 * any other sleep) on Haswell machines with LPT and LPT-LP
> +		 * with the new Intel BIOS
> +		 */
> +		xhci->quirks |= XHCI_HSW_SPURIOUS_WAKEUP;
> +	}
>  	if (pdev->vendor == PCI_VENDOR_ID_ETRON &&
>  			pdev->device == PCI_DEVICE_ID_ASROCK_P67) {
>  		xhci->quirks |= XHCI_RESET_ON_RESUME;
> @@ -217,6 +226,11 @@ static void xhci_pci_remove(struct pci_dev *dev)
>  		usb_put_hcd(xhci->shared_hcd);
>  	}
>  	usb_hcd_pci_remove(dev);
> +
> +	/* Workaround for spurious wakeups at shutdown with HSW */
> +	if (xhci->quirks & XHCI_HSW_SPURIOUS_WAKEUP)
> +		pci_set_power_state(dev, PCI_D3hot);
> +
>  	kfree(xhci);
>  }
>  
> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> index 49b6edb..d6f953c 100644
> --- a/drivers/usb/host/xhci.c
> +++ b/drivers/usb/host/xhci.c
> @@ -730,6 +730,9 @@ void xhci_shutdown(struct usb_hcd *hcd)
>  
>  	spin_lock_irq(&xhci->lock);
>  	xhci_halt(xhci);
> +	/* Workaround for spurious wakeups at shutdown with HSW */
> +	if (xhci->quirks & XHCI_HSW_SPURIOUS_WAKEUP)
> +		xhci_reset(xhci);
>  	spin_unlock_irq(&xhci->lock);
>  
>  	xhci_cleanup_msix(xhci);
> @@ -737,6 +740,10 @@ void xhci_shutdown(struct usb_hcd *hcd)
>  	xhci_dbg_trace(xhci, trace_xhci_dbg_init,
>  			"xhci_shutdown completed - status = %x",
>  			xhci_readl(xhci, &xhci->op_regs->status));
> +
> +	/* Yet another workaround for spurious wakeups at shutdown with HSW */
> +	if (xhci->quirks & XHCI_HSW_SPURIOUS_WAKEUP)
> +		pci_set_power_state(to_pci_dev(hcd->self.controller), PCI_D3hot);
>  }
>  
>  #ifdef CONFIG_PM
> diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
> index 46aa148..d71386b 100644
> --- a/drivers/usb/host/xhci.h
> +++ b/drivers/usb/host/xhci.h
> @@ -1538,6 +1538,7 @@ struct xhci_hcd {
>  #define XHCI_COMP_MODE_QUIRK	(1 << 14)
>  #define XHCI_AVOID_BEI		(1 << 15)
>  #define XHCI_PLAT		(1 << 16)
> +#define XHCI_HSW_SPURIOUS_WAKEUP (1 << 17)
>  	unsigned int		num_active_eps;
>  	unsigned int		limit_active_eps;
>  	/* There are two roothubs to keep track of bus suspend info for */
> diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
> index bc95b2b..1b3ab7d 100644
> --- a/include/linux/pci_ids.h
> +++ b/include/linux/pci_ids.h
> @@ -2860,7 +2860,9 @@
>  #define PCI_DEVICE_ID_INTEL_82454NX     0x84cb
>  #define PCI_DEVICE_ID_INTEL_84460GX	0x84ea
>  #define PCI_DEVICE_ID_INTEL_IXP4XX	0x8500
> +#define PCI_DEVICE_ID_INTEL_LYNXPOINT_XHCI	0x8c31
>  #define PCI_DEVICE_ID_INTEL_IXP2800	0x9004
> +#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI	0x9c31
>  #define PCI_DEVICE_ID_INTEL_S21152BB	0xb152
>  
>  #define PCI_VENDOR_ID_SCALEMP		0x8686
> -- 
> 1.8.4
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux