Merge 4.9-rc3 into usb-next
We want the USB fixes in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -39,7 +39,7 @@
|
||||
|
||||
#define DRIVER_DESC "EHCI generic platform driver"
|
||||
#define EHCI_MAX_CLKS 4
|
||||
#define EHCI_MAX_RSTS 3
|
||||
#define EHCI_MAX_RSTS 4
|
||||
#define hcd_to_ehci_priv(h) ((struct ehci_platform_priv *)hcd_to_ehci(h)->priv)
|
||||
|
||||
struct ehci_platform_priv {
|
||||
|
@@ -221,6 +221,12 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
|
||||
ohci->num_ports = board->ports;
|
||||
at91_start_hc(pdev);
|
||||
|
||||
/*
|
||||
* The RemoteWakeupConnected bit has to be set explicitly
|
||||
* before calling ohci_run. The reset value of this bit is 0.
|
||||
*/
|
||||
ohci->hc_control = OHCI_CTRL_RWC;
|
||||
|
||||
retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
|
||||
if (retval == 0) {
|
||||
device_wakeup_enable(hcd->self.controller);
|
||||
@@ -618,9 +624,6 @@ ohci_hcd_at91_drv_suspend(struct device *dev)
|
||||
* REVISIT: some boards will be able to turn VBUS off...
|
||||
*/
|
||||
if (!ohci_at91->wakeup) {
|
||||
ohci->hc_control = ohci_readl(ohci, &ohci->regs->control);
|
||||
ohci->hc_control &= OHCI_CTRL_RWC;
|
||||
ohci_writel(ohci, ohci->hc_control, &ohci->regs->control);
|
||||
ohci->rh_state = OHCI_RH_HALTED;
|
||||
|
||||
/* flush the writes */
|
||||
|
@@ -72,7 +72,7 @@
|
||||
static const char hcd_name [] = "ohci_hcd";
|
||||
|
||||
#define STATECHANGE_DELAY msecs_to_jiffies(300)
|
||||
#define IO_WATCHDOG_DELAY msecs_to_jiffies(250)
|
||||
#define IO_WATCHDOG_DELAY msecs_to_jiffies(275)
|
||||
|
||||
#include "ohci.h"
|
||||
#include "pci-quirks.h"
|
||||
|
@@ -1166,7 +1166,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
||||
xhci_set_link_state(xhci, port_array, wIndex,
|
||||
XDEV_RESUME);
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
msleep(20);
|
||||
msleep(USB_RESUME_TIMEOUT);
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
xhci_set_link_state(xhci, port_array, wIndex,
|
||||
XDEV_U0);
|
||||
@@ -1355,6 +1355,35 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Workaround for missing Cold Attach Status (CAS) if device re-plugged in S3.
|
||||
* warm reset a USB3 device stuck in polling or compliance mode after resume.
|
||||
* See Intel 100/c230 series PCH specification update Doc #332692-006 Errata #8
|
||||
*/
|
||||
static bool xhci_port_missing_cas_quirk(int port_index,
|
||||
__le32 __iomem **port_array)
|
||||
{
|
||||
u32 portsc;
|
||||
|
||||
portsc = readl(port_array[port_index]);
|
||||
|
||||
/* if any of these are set we are not stuck */
|
||||
if (portsc & (PORT_CONNECT | PORT_CAS))
|
||||
return false;
|
||||
|
||||
if (((portsc & PORT_PLS_MASK) != XDEV_POLLING) &&
|
||||
((portsc & PORT_PLS_MASK) != XDEV_COMP_MODE))
|
||||
return false;
|
||||
|
||||
/* clear wakeup/change bits, and do a warm port reset */
|
||||
portsc &= ~(PORT_RWC_BITS | PORT_CEC | PORT_WAKE_BITS);
|
||||
portsc |= PORT_WR;
|
||||
writel(portsc, port_array[port_index]);
|
||||
/* flush write */
|
||||
readl(port_array[port_index]);
|
||||
return true;
|
||||
}
|
||||
|
||||
int xhci_bus_resume(struct usb_hcd *hcd)
|
||||
{
|
||||
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
||||
@@ -1392,6 +1421,14 @@ int xhci_bus_resume(struct usb_hcd *hcd)
|
||||
u32 temp;
|
||||
|
||||
temp = readl(port_array[port_index]);
|
||||
|
||||
/* warm reset CAS limited ports stuck in polling/compliance */
|
||||
if ((xhci->quirks & XHCI_MISSING_CAS) &&
|
||||
(hcd->speed >= HCD_USB3) &&
|
||||
xhci_port_missing_cas_quirk(port_index, port_array)) {
|
||||
xhci_dbg(xhci, "reset stuck port %d\n", port_index);
|
||||
continue;
|
||||
}
|
||||
if (DEV_SUPERSPEED_ANY(temp))
|
||||
temp &= ~(PORT_RWC_BITS | PORT_CEC | PORT_WAKE_BITS);
|
||||
else
|
||||
@@ -1410,7 +1447,7 @@ int xhci_bus_resume(struct usb_hcd *hcd)
|
||||
|
||||
if (need_usb2_u3_exit) {
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
msleep(20);
|
||||
msleep(USB_RESUME_TIMEOUT);
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
}
|
||||
|
||||
|
@@ -45,11 +45,13 @@
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_LYNXPOINT_XHCI 0x8c31
|
||||
#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI 0x9c31
|
||||
#define PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_XHCI 0x9cb1
|
||||
#define PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI 0x22b5
|
||||
#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_XHCI 0xa12f
|
||||
#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI 0x9d2f
|
||||
#define PCI_DEVICE_ID_INTEL_BROXTON_M_XHCI 0x0aa8
|
||||
#define PCI_DEVICE_ID_INTEL_BROXTON_B_XHCI 0x1aa8
|
||||
#define PCI_DEVICE_ID_INTEL_APL_XHCI 0x5aa8
|
||||
|
||||
static const char hcd_name[] = "xhci_hcd";
|
||||
|
||||
@@ -153,7 +155,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
xhci->quirks |= XHCI_SPURIOUS_REBOOT;
|
||||
}
|
||||
if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI) {
|
||||
(pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI ||
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_XHCI)) {
|
||||
xhci->quirks |= XHCI_SPURIOUS_REBOOT;
|
||||
xhci->quirks |= XHCI_SPURIOUS_WAKEUP;
|
||||
}
|
||||
@@ -169,6 +172,11 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI) {
|
||||
xhci->quirks |= XHCI_SSIC_PORT_UNUSED;
|
||||
}
|
||||
if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
|
||||
(pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI ||
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI))
|
||||
xhci->quirks |= XHCI_MISSING_CAS;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ETRON &&
|
||||
pdev->device == PCI_DEVICE_ID_EJ168) {
|
||||
xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
|
@@ -314,6 +314,8 @@ struct xhci_op_regs {
|
||||
#define XDEV_U2 (0x2 << 5)
|
||||
#define XDEV_U3 (0x3 << 5)
|
||||
#define XDEV_INACTIVE (0x6 << 5)
|
||||
#define XDEV_POLLING (0x7 << 5)
|
||||
#define XDEV_COMP_MODE (0xa << 5)
|
||||
#define XDEV_RESUME (0xf << 5)
|
||||
/* true: port has power (see HCC_PPC) */
|
||||
#define PORT_POWER (1 << 9)
|
||||
@@ -1653,6 +1655,7 @@ struct xhci_hcd {
|
||||
#define XHCI_MTK_HOST (1 << 21)
|
||||
#define XHCI_SSIC_PORT_UNUSED (1 << 22)
|
||||
#define XHCI_NO_64BIT_SUPPORT (1 << 23)
|
||||
#define XHCI_MISSING_CAS (1 << 24)
|
||||
unsigned int num_active_eps;
|
||||
unsigned int limit_active_eps;
|
||||
/* There are two roothubs to keep track of bus suspend info for */
|
||||
|
Reference in New Issue
Block a user