On Tue, 23 Jul 2013, Mathias Nyman wrote: > Make the Linux xHCI driver automatically try to switchover the EHCI ports to > xHCI when an Intel xHCI host is detected, and it also finds an Intel EHCI host. > > This means we will no longer have to add Intel xHCI hosts to a quirks list when > the PCI device IDs change. Simply continuing to add new Intel xHCI PCI device > IDs to the quirks list is not sustainable. > > During suspend ports may be swicthed back to EHCI by BIOS and not properly > restored to xHCI at resume. Previously both EHCI and xHCI resume functions > switched ports back to XHCI, but it's enough to do it in xHCI only > because the hub driver doesn't start running again until after both hosts are resumed. > > Signed-off-by: Mathias Nyman <mathias.nyman@xxxxxxxxxxxxxxx> > -void usb_enable_xhci_ports(struct pci_dev *xhci_pdev) > +void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev) > { > u32 ports_available; > + bool ehci_found = false; > + struct pci_dev *companion = NULL; > + > + /* make sure an intel EHCI controller exists */ > + for_each_pci_dev(companion) { > + if (companion->class == PCI_CLASS_SERIAL_USB_EHCI && > + companion->vendor == PCI_VENDOR_ID_INTEL) { > + ehci_found = true; > + break; > + } > + } > + > + if (!ehci_found) > + return; > > /* Don't switchover the ports if the user hasn't compiled the xHCI > * driver. Otherwise they will see "dead" USB ports that don't power > --- a/drivers/usb/host/xhci-pci.c > +++ b/drivers/usb/host/xhci-pci.c > @@ -250,13 +250,15 @@ static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated) > * writers. > * > * Unconditionally switch the ports back to xHCI after a system resume. > - * We can't tell whether the EHCI or xHCI controller will be resumed > - * first, so we have to do the port switchover in both drivers. Writing > - * a '1' to the port switchover registers should have no effect if the > - * port was already switched over. > + * It should not matter whether the EHCI or xHCI controller is > + * resumed first. It's enough to do the switchover in xHCI because > + * USB core won't notice anything as the hub driver doesn't start > + * running again until after all the devices (including both EHCI and > + * xHCI host controllers) have been resumed. > */ > - if (usb_is_intel_switchable_xhci(pdev)) > - usb_enable_xhci_ports(pdev); > + > + if (pdev->vendor == PCI_VENDOR_ID_INTEL) > + usb_enable_intel_xhci_ports(pdev); Short and sweet; I like it! Alan Stern -- 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