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

Configure Feed

Select the types of activity you want to include in your feed.

usb:xhci:Add quirk for Certain failing HP keyboard on reset after resume

Certain HP keyboards would keep inputting a character automatically which
is the wake-up key after S3 resume

On some AMD platforms USB host fails to respond (by holding resume-K) to
USB device (an HP keyboard) resume request within 1ms (TURSM) and ensures
that resume is signaled for at least 20 ms (TDRSMDN), which is defined in
USB 2.0 spec. The result is that the keyboard is out of function.

In SNPS USB design, the host responds to the resume request only after
system gets back to S0 and the host gets to functional after the internal
HW restore operation that is more than 1 second after the initial resume
request from the USB device.

As a workaround for specific keyboard ID(HP Keyboards), applying port reset
after resume when the keyboard is plugged in.

Signed-off-by: Sandeep Singh <Sandeep.Singh@amd.com>
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
cc: Nehal Shah <Nehal-bakulchandra.Shah@amd.com>
Reviewed-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Sandeep Singh and committed by
Greg Kroah-Hartman
e788787e 8cc34c8d

+13 -5
+1
drivers/usb/core/quirks.c
··· 249 249 { USB_DEVICE(0x093a, 0x2500), .driver_info = USB_QUIRK_RESET_RESUME }, 250 250 { USB_DEVICE(0x093a, 0x2510), .driver_info = USB_QUIRK_RESET_RESUME }, 251 251 { USB_DEVICE(0x093a, 0x2521), .driver_info = USB_QUIRK_RESET_RESUME }, 252 + { USB_DEVICE(0x03f0, 0x2b4a), .driver_info = USB_QUIRK_RESET_RESUME }, 252 253 253 254 /* Logitech Optical Mouse M90/M100 */ 254 255 { USB_DEVICE(0x046d, 0xc05a), .driver_info = USB_QUIRK_RESET_RESUME },
+12 -5
drivers/usb/host/pci-quirks.c
··· 98 98 AMD_CHIPSET_HUDSON2, 99 99 AMD_CHIPSET_BOLTON, 100 100 AMD_CHIPSET_YANGTZE, 101 + AMD_CHIPSET_TAISHAN, 101 102 AMD_CHIPSET_UNKNOWN, 102 103 }; 103 104 ··· 142 141 pinfo->sb_type.gen = AMD_CHIPSET_SB700; 143 142 else if (rev >= 0x40 && rev <= 0x4f) 144 143 pinfo->sb_type.gen = AMD_CHIPSET_SB800; 144 + } 145 + pinfo->smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD, 146 + 0x145c, NULL); 147 + if (pinfo->smbus_dev) { 148 + pinfo->sb_type.gen = AMD_CHIPSET_TAISHAN; 145 149 } else { 146 150 pinfo->smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD, 147 151 PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL); ··· 266 260 { 267 261 /* Make sure amd chipset type has already been initialized */ 268 262 usb_amd_find_chipset_info(); 269 - if (amd_chipset.sb_type.gen != AMD_CHIPSET_YANGTZE) 270 - return 0; 271 - 272 - dev_dbg(&pdev->dev, "QUIRK: Enable AMD remote wakeup fix\n"); 273 - return 1; 263 + if (amd_chipset.sb_type.gen == AMD_CHIPSET_YANGTZE || 264 + amd_chipset.sb_type.gen == AMD_CHIPSET_TAISHAN) { 265 + dev_dbg(&pdev->dev, "QUIRK: Enable AMD remote wakeup fix\n"); 266 + return 1; 267 + } 268 + return 0; 274 269 } 275 270 EXPORT_SYMBOL_GPL(usb_hcd_amd_remote_wakeup_quirk); 276 271