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 <[email protected]>
> Acked-by: Alan Stern <[email protected]>

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?

Alan Stern

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

Reply via email to