[PATCH v5 0/3] USB/UVC: Add quirks to prevent Razer Kiyo Pro xHCI cascade failure

JP Hein
2026-03-31T00:38:09Z

The Razer Kiyo Pro (1532:0e05) is a USB 3.0 webcam whose firmware has a
well-documented failure mode that cascades into complete xHCI host
controller death, disconnecting every USB device on the bus -- including
keyboards and mice, requiring a hard reboot.

The device has two crash triggers:

1. LPM/autosuspend resume: Device enters LPM or autosuspend, fails to
reinitialize on resume, producing EPIPE (-32) on UVC SET_CUR. The
stalled endpoint triggers an xHCI stop-endpoint timeout, and the
kernel declares the host controller dead.

2. Rapid control transfers: sustained rapid UVC SET_CUR operations
(hundreds over several seconds) overwhelm the firmware. The error-code query
(GET_CUR on UVC_VC_REQUEST_ERROR_CODE_CONTROL) amplifies the
failure by sending a second transfer to the already-stalling device,
pushing it into a full lockup and xHCI controller death.

This has been reported as Ubuntu Launchpad Bug #2061177, with reports
across kernel versions 6.5 through 6.8.

This series adds three patches:

Patch 1: USB core -- USB_QUIRK_NO_LPM to prevent Link Power Management
transitions that destabilize the device firmware.

Patch 2: UVC driver -- introduce UVC_QUIRK_CTRL_THROTTLE to rate-limit
SET_CUR control transfers (50ms minimum interval) and skip the
error-code query after EPIPE errors on affected devices.

Patch 3: UVC driver -- add Razer Kiyo Pro device table entry with
UVC_QUIRK_CTRL_THROTTLE, UVC_QUIRK_DISABLE_AUTOSUSPEND, and
UVC_QUIRK_NO_RESET_RESUME to address both crash triggers.

Together, these keep the device in a stable active state, prevent rapid
control transfer crashes, and avoid the power management transitions
that trigger the firmware bug.

Testing on 6.17.0-19-generic (Ubuntu 24.04 HWE) with dynamic debug
enabled and NO patches or workarounds applied:
- v4l2-ctl stress test (control transfers only): passes 50/50
- Starting a video call: triggers hc_died() via LPM disable failure
during isochronous stream setup
- Stress test during active video call: firmware stalls at round 19,
repeated endpoint stalls with -32 EPIPE

The 6.8 -> 6.17 xHCI error handling improvements help with control
transfer recovery, but the firmware lockup during video streaming still
cascades to hc_died(). The patches in this series prevent the firmware
from reaching the lockup state in the first place.

Changes since v4:
- Dropped stable CC (new quirks, not regression fixes)
- Updated cover letter with 6.17 test results

Changes since v3:
- Regenerated patches against media-committers next branch to fix
context mismatch (v3 was based on Ubuntu 6.8 source)

Tested on:
- Kernel: 6.17.0-19-generic (Ubuntu 24.04 HWE) and 6.8.0-106-generic
- Hardware: Intel Cannon Lake PCH xHCI (8086:a36d)
- Device: Razer Kiyo Pro (1532:0e05), firmware 1.5.0.1

Stress test, crash evidence, and debug logs:
https://github.com/jphein/kiyo-xhci-fix

JP Hein (3):
USB: core: add NO_LPM quirk for Razer Kiyo Pro webcam
media: uvcvideo: add UVC_QUIRK_CTRL_THROTTLE for fragile firmware
media: uvcvideo: add quirks for Razer Kiyo Pro webcam

drivers/media/usb/uvc/uvc_driver.c | 17 ++++++++++++++++
drivers/media/usb/uvc/uvc_video.c | 32 ++++++++++++++++++++++++++++++
drivers/media/usb/uvc/uvcvideo.h | 3 +++
drivers/usb/core/quirks.c | 2 ++
4 files changed, 54 insertions(+)