Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xHCI: Check host USB2 LPM capability

Check the host's USB2 LPM capability.

USB2 software LPM support is optional for xHCI 0.96 hosts. xHCI 1.0 hosts
should support software LPM, and may support hardware LPM.

Signed-off-by: Andiry Xu <andiry.xu@amd.com>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Andiry Xu and committed by
Greg Kroah-Hartman
fc71ff75 6fd45621

+27
+6
drivers/usb/host/xhci-ext-caps.h
··· 65 65 /* bits 1:2, 5:12, and 17:19 need to be preserved; bits 21:28 should be zero */ 66 66 #define XHCI_LEGACY_DISABLE_SMI ((0x3 << 1) + (0xff << 5) + (0x7 << 17)) 67 67 68 + /* USB 2.0 xHCI 0.96 L1C capability - section 7.2.2.1.3.2 */ 69 + #define XHCI_L1C (1 << 16) 70 + 71 + /* USB 2.0 xHCI 1.0 hardware LMP capability - section 7.2.2.1.3.2 */ 72 + #define XHCI_HLC (1 << 19) 73 + 68 74 /* command register values to disable interrupts and halt the HC */ 69 75 /* start/stop HC execution - do not write unless HC is halted*/ 70 76 #define XHCI_CMD_RUN (1 << 0)
+17
drivers/usb/host/xhci-mem.c
··· 1959 1959 if (port_offset == 0 || (port_offset + port_count - 1) > num_ports) 1960 1960 /* WTF? "Valid values are ‘1’ to MaxPorts" */ 1961 1961 return; 1962 + 1963 + /* Check the host's USB2 LPM capability */ 1964 + if ((xhci->hci_version == 0x96) && (major_revision != 0x03) && 1965 + (temp & XHCI_L1C)) { 1966 + xhci_dbg(xhci, "xHCI 0.96: support USB2 software lpm\n"); 1967 + xhci->sw_lpm_support = 1; 1968 + } 1969 + 1970 + if ((xhci->hci_version >= 0x100) && (major_revision != 0x03)) { 1971 + xhci_dbg(xhci, "xHCI 1.0: support USB2 software lpm\n"); 1972 + xhci->sw_lpm_support = 1; 1973 + if (temp & XHCI_HLC) { 1974 + xhci_dbg(xhci, "xHCI 1.0: support USB2 hardware lpm\n"); 1975 + xhci->hw_lpm_support = 1; 1976 + } 1977 + } 1978 + 1962 1979 port_offset--; 1963 1980 for (i = port_offset; i < (port_offset + port_count); i++) { 1964 1981 /* Duplicate entry. Ignore the port if the revisions differ. */
+4
drivers/usb/host/xhci.h
··· 1459 1459 /* Array of pointers to USB 2.0 PORTSC registers */ 1460 1460 __le32 __iomem **usb2_ports; 1461 1461 unsigned int num_usb2_ports; 1462 + /* support xHCI 0.96 spec USB2 software LPM */ 1463 + unsigned sw_lpm_support:1; 1464 + /* support xHCI 1.0 spec USB2 hardware LPM */ 1465 + unsigned hw_lpm_support:1; 1462 1466 }; 1463 1467 1464 1468 /* convert between an HCD pointer and the corresponding EHCI_HCD */