aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/xhci.c
diff options
context:
space:
mode:
authorSarah Sharp <sarah.a.sharp@linux.intel.com>2013-10-07 20:17:20 -0400
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2013-10-16 15:24:18 -0400
commit58e21f73975ec927119370635bf68b9023831c56 (patch)
tree42868c13baa8afff6172238357bd77c98b4e04e3 /drivers/usb/host/xhci.c
parentdcc01c0864823f91c3bf3ffca6613e2351702b87 (diff)
xhci: Set L1 device slot on USB2 LPM enable/disable.
To enable USB 2.0 Link Power Management (LPM), the xHCI host controller needs the device slot ID to generate the device address used in L1 entry tokens. That information is set in the L1 device slot ID field of the USB 2.0 LPM registers. Currently, the L1 device slot ID is overwritten when the xHCI driver initiates the software test of USB 2.0 Link PM in xhci_usb2_software_lpm_test. It is never cleared when USB 2.0 Link PM is disabled for the device. That should be harmless, because the Hardware LPM Enable (HLE) bit is cleared when USB 2.0 Link PM is disabled, so the host should not pay attention to the slot ID. This patch should have no effect on host behavior, but since xhci_usb2_software_lpm_test is going away in an upcoming bug fix patch, we need to move that code to the function that enables and disables USB 2.0 Link PM. This patch should be backported to kernels as old as 3.11, that contain the commit a558ccdcc71c7770c5e80c926a31cfe8a3892a09 "usb: xhci: add USB2 Link power management BESL support". The upcoming bug fix patch is also marked for that stable kernel. Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/usb/host/xhci.c')
-rw-r--r--drivers/usb/host/xhci.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 1e36dbb48366..2983e5dd98bf 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -4216,7 +4216,7 @@ int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd,
4216 } 4216 }
4217 4217
4218 pm_val &= ~PORT_HIRD_MASK; 4218 pm_val &= ~PORT_HIRD_MASK;
4219 pm_val |= PORT_HIRD(hird) | PORT_RWE; 4219 pm_val |= PORT_HIRD(hird) | PORT_RWE | PORT_L1DS(udev->slot_id);
4220 xhci_writel(xhci, pm_val, pm_addr); 4220 xhci_writel(xhci, pm_val, pm_addr);
4221 pm_val = xhci_readl(xhci, pm_addr); 4221 pm_val = xhci_readl(xhci, pm_addr);
4222 pm_val |= PORT_HLE; 4222 pm_val |= PORT_HLE;
@@ -4224,7 +4224,7 @@ int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd,
4224 /* flush write */ 4224 /* flush write */
4225 xhci_readl(xhci, pm_addr); 4225 xhci_readl(xhci, pm_addr);
4226 } else { 4226 } else {
4227 pm_val &= ~(PORT_HLE | PORT_RWE | PORT_HIRD_MASK); 4227 pm_val &= ~(PORT_HLE | PORT_RWE | PORT_HIRD_MASK | PORT_L1DS_MASK);
4228 xhci_writel(xhci, pm_val, pm_addr); 4228 xhci_writel(xhci, pm_val, pm_addr);
4229 /* flush write */ 4229 /* flush write */
4230 xhci_readl(xhci, pm_addr); 4230 xhci_readl(xhci, pm_addr);