Message ID | 1498446152-21238-2-git-send-email-acelan.kao@canonical.com |
---|---|
State | New |
Headers | show |
On 26.06.2017 05:02, AceLan Kao wrote: > From: Jiahau Chang <jiahau@gmail.com> > > BugLink: http://bugs.launchpad.net/bugs/1695216 > > v4: Remove the patch code in case USB_PORT_FEAT_REMOTE_WAKE_MASK > > For AMD Promontory xHCI host, although you can disable USB 2.0 ports in BIOS > settings, those ports will be enabled anyway after you remove a device on > that port and re-plug it in again. It's a known limitation of the chip. > As a workaround we can clear the PORT_WAKE_BITS. > > Signed-off-by: Jiahau Chang <Lars_Chang@asmedia.com.tw> > Signed-off-by: AceLan Kao <acelan.kao@canonical.com> Acked-by: Stefan Bader <stefan.bader@canonical.com> > --- > drivers/usb/host/xhci-hub.c | 2 ++ > drivers/usb/host/xhci-pci.c | 13 +++++++++++++ > drivers/usb/host/xhci.h | 2 ++ > 3 files changed, 17 insertions(+) > > diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c > index 7e2c0de..635198d 100644 > --- a/drivers/usb/host/xhci-hub.c > +++ b/drivers/usb/host/xhci-hub.c > @@ -1342,6 +1342,8 @@ int xhci_bus_suspend(struct usb_hcd *hcd) > t2 |= PORT_WKOC_E | PORT_WKCONN_E; > t2 &= ~PORT_WKDISC_E; > } > + if ((xhci->quirks & XHCI_U2_DISABLE_WAKE) && (hcd->speed < HCD_USB3)) > + t2 &= ~PORT_WAKE_BITS; > } else > t2 &= ~PORT_WAKE_BITS; > > diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c > index 9604600..02c3fca 100644 > --- a/drivers/usb/host/xhci-pci.c > +++ b/drivers/usb/host/xhci-pci.c > @@ -54,6 +54,11 @@ > #define PCI_DEVICE_ID_INTEL_APL_XHCI 0x5aa8 > #define PCI_DEVICE_ID_INTEL_DNV_XHCI 0x19d0 > > +#define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9 > +#define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba > +#define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb > +#define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc > + > static const char hcd_name[] = "xhci_hcd"; > > static struct hc_driver __read_mostly xhci_pci_hc_driver; > @@ -136,6 +141,14 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) > if (pdev->vendor == PCI_VENDOR_ID_AMD) > xhci->quirks |= XHCI_TRUST_TX_LENGTH; > > + if ((pdev->vendor == PCI_VENDOR_ID_AMD) && > + ((pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4) || > + (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_3) || > + (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_2) || > + (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_1))) > + xhci->quirks |= XHCI_U2_DISABLE_WAKE; > + > + > if (pdev->vendor == PCI_VENDOR_ID_INTEL) { > xhci->quirks |= XHCI_LPM_SUPPORT; > xhci->quirks |= XHCI_INTEL_HOST; > diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h > index 2e34c9f..d723fef 100644 > --- a/drivers/usb/host/xhci.h > +++ b/drivers/usb/host/xhci.h > @@ -1644,6 +1644,8 @@ struct xhci_hcd { > #define XHCI_BROKEN_STREAMS (1 << 19) > #define XHCI_PME_STUCK_QUIRK (1 << 20) > #define XHCI_MISSING_CAS (1 << 24) > +#define XHCI_U2_DISABLE_WAKE (1 << 27) > + > unsigned int num_active_eps; > unsigned int limit_active_eps; > /* There are two roothubs to keep track of bus suspend info for */ >
Acked-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
Applied to xenial master-next branch. Thanks. Cascardo.
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index 7e2c0de..635198d 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c @@ -1342,6 +1342,8 @@ int xhci_bus_suspend(struct usb_hcd *hcd) t2 |= PORT_WKOC_E | PORT_WKCONN_E; t2 &= ~PORT_WKDISC_E; } + if ((xhci->quirks & XHCI_U2_DISABLE_WAKE) && (hcd->speed < HCD_USB3)) + t2 &= ~PORT_WAKE_BITS; } else t2 &= ~PORT_WAKE_BITS; diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 9604600..02c3fca 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -54,6 +54,11 @@ #define PCI_DEVICE_ID_INTEL_APL_XHCI 0x5aa8 #define PCI_DEVICE_ID_INTEL_DNV_XHCI 0x19d0 +#define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9 +#define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba +#define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb +#define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc + static const char hcd_name[] = "xhci_hcd"; static struct hc_driver __read_mostly xhci_pci_hc_driver; @@ -136,6 +141,14 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) if (pdev->vendor == PCI_VENDOR_ID_AMD) xhci->quirks |= XHCI_TRUST_TX_LENGTH; + if ((pdev->vendor == PCI_VENDOR_ID_AMD) && + ((pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4) || + (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_3) || + (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_2) || + (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_1))) + xhci->quirks |= XHCI_U2_DISABLE_WAKE; + + if (pdev->vendor == PCI_VENDOR_ID_INTEL) { xhci->quirks |= XHCI_LPM_SUPPORT; xhci->quirks |= XHCI_INTEL_HOST; diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 2e34c9f..d723fef 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1644,6 +1644,8 @@ struct xhci_hcd { #define XHCI_BROKEN_STREAMS (1 << 19) #define XHCI_PME_STUCK_QUIRK (1 << 20) #define XHCI_MISSING_CAS (1 << 24) +#define XHCI_U2_DISABLE_WAKE (1 << 27) + unsigned int num_active_eps; unsigned int limit_active_eps; /* There are two roothubs to keep track of bus suspend info for */