On 07/22/2013 06:23 PM, Alan Stern wrote:
On Mon, 22 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.ny...@linux.intel.com>
Acked-by: Alan Stern<st...@rowland.harvard.edu>

It is noticeable that this code:

diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c
index b9848e4..90f927f 100644
--- a/drivers/usb/host/pci-quirks.c
+++ b/drivers/usb/host/pci-quirks.c

@@ -921,8 +895,16 @@ static void quirk_usb_handoff_xhci(struct pci_dev *pdev)
        writel(val, base + ext_cap_offset + XHCI_LEGACY_CONTROL_OFFSET);

  hc_init:
-       if (usb_is_intel_switchable_xhci(pdev))
-               usb_enable_xhci_ports(pdev);
+       if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
+               struct pci_dev *companion = NULL;
+               for_each_pci_dev(companion) {
+                       if (companion->class == PCI_CLASS_SERIAL_USB_EHCI&&
+                           companion->vendor == PCI_VENDOR_ID_INTEL) {
+                               usb_enable_intel_xhci_ports(pdev);
+                               break;
+                       }
+               }
+       }

and this code:

diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
index cc24e39..0e83863 100644
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
@@ -250,13 +250,23 @@ static int xhci_pci_resume(struct usb_hcd *hcd, bool 
hibernated)
...
-       if (usb_is_intel_switchable_xhci(pdev))
-               usb_enable_xhci_ports(pdev);
+
+       if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
+               struct pci_dev *companion = NULL;
+               for_each_pci_dev(companion) {
+                       if (companion->class == PCI_CLASS_SERIAL_USB_EHCI&&
+                           companion->vendor == PCI_VENDOR_ID_INTEL) {
+                               usb_enable_intel_xhci_ports(pdev);
+                               break;
+                       }
+               }
+       }

are identical.  Can you have xhci-pci.c call pci-quirks.c, to get rid
of the duplication?


Ah, sure.
The EHCI pci walk can be moved to be a part of usb_enable_intel_xhci_ports().
I'll fix it.

-Mathias

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to