Intel xhci: Work around immediate reboot on shutdown.

Hi Greg,
 
 I'm cleaning out my queue before I leave on vacation tomorrow, so here's
 one more patch for 3.6.  It works around an issue on a couple Intel
 Panther Point desktop systems that cause them to reboot about 10 seconds
 after the user shutdowns the system.
 
 Sarah Sharp
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.11 (GNU/Linux)
 
 iQIcBAABAgAGBQJQJBQDAAoJEBMGWMLi1Gc55F8P/1gLTQ+MYCbKeQ2oMPwqYuXy
 vNOSPHWlzesHdLz4uHdxWnbxC8GJA/fZmMmtHVKoWE75XYgR09Rv7EsAy0Gc+g1r
 f8jasrq5SeXI4bKQlecr3m2qyPDaf1vXmGD1tH324qcgZHvV0AGCwLJkY/8OOS04
 LJkGYKp+Zx9mAkjaOHGHYcC+ucxkq2D9klbnJgNaBN5lNLMuIm1VuASG685JjyIe
 heJUDOvFkH4gOm2pi2BNOaIt8pX0DpwnBfKN9tJZCSc+/mzcNxXjS/JG/Z1fG45I
 /7VMEuoslVTthiIYwMyUpy0Sy+CTonfR5W1EBaNB2Zf8xmqMuu212dcqOMJg8fOC
 UnKJKuHD7HAAtOYlMYCQNO8oJImQAP+FBAtm6HXSApGxn0L7Lb4nX8mpGmfPEZo/
 2ibcTXJHw8hUD2r2oW/EBkg9eIUg5dymOpKs3qjhLLpRSAMYx76WExtzI61cn5fc
 lgtAWlaFz25RlQjnjNY6IXfbFFfHoqtmdEhqxOGQ+YVG+JL35KM3HJX6vBVdTxSB
 keyDxDjv94Q7XjmCw8xZhF/myhLp98C6HNn7xygIvALfkiZ+2cdyYqRLOUpQybPP
 8LnP2St3s9s16p9W15s8IyKZzZXkbXlYzDGum6M+eSx2nbMLBUCojSgQQgUh31ao
 eq6RDqPvwNX4FdAX9POu
 =1OS4
 -----END PGP SIGNATURE-----

Merge tag 'for-usb-linus-2012-08-09' of git://git.kernel.org/pub/scm/linux/kernel/git/sarah/xhci into usb-linus

Intel xhci: Work around immediate reboot on shutdown.

Hi Greg,

I'm cleaning out my queue before I leave on vacation tomorrow, so here's
one more patch for 3.6.  It works around an issue on a couple Intel
Panther Point desktop systems that cause them to reboot about 10 seconds
after the user shutdowns the system.

Sarah Sharp
This commit is contained in:
Greg Kroah-Hartman 2012-08-09 13:06:19 -07:00
commit 3557c9ae26
5 changed files with 21 additions and 0 deletions

View File

@ -800,6 +800,13 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev)
}
EXPORT_SYMBOL_GPL(usb_enable_xhci_ports);
void usb_disable_xhci_ports(struct pci_dev *xhci_pdev)
{
pci_write_config_dword(xhci_pdev, USB_INTEL_USB3_PSSEN, 0x0);
pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR, 0x0);
}
EXPORT_SYMBOL_GPL(usb_disable_xhci_ports);
/**
* PCI Quirks for xHCI.
*

View File

@ -10,6 +10,7 @@ void usb_amd_quirk_pll_disable(void);
void usb_amd_quirk_pll_enable(void);
bool usb_is_intel_switchable_xhci(struct pci_dev *pdev);
void usb_enable_xhci_ports(struct pci_dev *xhci_pdev);
void usb_disable_xhci_ports(struct pci_dev *xhci_pdev);
#else
static inline void usb_amd_quirk_pll_disable(void) {}
static inline void usb_amd_quirk_pll_enable(void) {}

View File

@ -94,6 +94,15 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
xhci->quirks |= XHCI_EP_LIMIT_QUIRK;
xhci->limit_active_eps = 64;
xhci->quirks |= XHCI_SW_BW_CHECKING;
/*
* PPT desktop boards DH77EB and DH77DF will power back on after
* a few seconds of being shutdown. The fix for this is to
* switch the ports from xHCI to EHCI on shutdown. We can't use
* DMI information to find those particular boards (since each
* vendor will change the board name), so we have to key off all
* PPT chipsets.
*/
xhci->quirks |= XHCI_SPURIOUS_REBOOT;
}
if (pdev->vendor == PCI_VENDOR_ID_ETRON &&
pdev->device == PCI_DEVICE_ID_ASROCK_P67) {

View File

@ -659,6 +659,9 @@ void xhci_shutdown(struct usb_hcd *hcd)
{
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
if (xhci->quirks && XHCI_SPURIOUS_REBOOT)
usb_disable_xhci_ports(to_pci_dev(hcd->self.controller));
spin_lock_irq(&xhci->lock);
xhci_halt(xhci);
spin_unlock_irq(&xhci->lock);

View File

@ -1494,6 +1494,7 @@ struct xhci_hcd {
#define XHCI_TRUST_TX_LENGTH (1 << 10)
#define XHCI_LPM_SUPPORT (1 << 11)
#define XHCI_INTEL_HOST (1 << 12)
#define XHCI_SPURIOUS_REBOOT (1 << 13)
unsigned int num_active_eps;
unsigned int limit_active_eps;
/* There are two roothubs to keep track of bus suspend info for */