Summary
configure_virtual_sinks() calls self.usb_device.reset() unconditionally before kernel_detach(). On the Arctis Nova 7 dongle (1038:22a1, bcdDevice 2.31) that reset leaves the device in a state where usbhid can no longer read the HID descriptor on interface 3:
usbhid 1-3:1.3: can't add hid device: -71
usbhid 1-3:1.3: probe with driver usbhid failed with error -71
The hidraw node for that interface disappears, headsetcontrol stops seeing the headset too, and every subsequent SET_REPORT times out. Only a physical replug recovers it — a service restart does not, because the reset happens again on each start.
Environment
- linux-arctis-manager 2.4.1 (pipx, Python 3.14.6)
- Fedora, kernel 7.1.5
- SteelSeries Arctis Nova 7,
1038:22a1, bcdDevice 2.31
Still present on v2.5.0-beta3 — the reset() call is unchanged there.
Evidence
The same -71 appears from kernel_attach() during teardown(), so once init has failed the interface is left with no driver bound at all:
$ for i in /sys/bus/usb/devices/1-3:1.*; do echo "$i: $(basename $(readlink $i/driver))"; done
/sys/bus/usb/devices/1-3:1.0: snd-usb-audio
/sys/bus/usb/devices/1-3:1.1: snd-usb-audio
/sys/bus/usb/devices/1-3:1.2: snd-usb-audio
/sys/bus/usb/devices/1-3:1.3: (none)
/sys/bus/usb/devices/1-3:1.4: usbhid
/sys/bus/usb/devices/1-3:1.5: usbhid
With the reset skipped, init succeeds reliably whenever the headset is powered on — verified with pyusb against the same interface, SET_REPORT completing in ~2 ms.
Suggested fix
Make the reset opt-in, or skip it for known-affected product IDs. Local workaround in use here:
if os.environ.get('LAM_SKIP_USB_RESET', '1') != '1':
try:
self.usb_device.reset()
except usb.core.USBError as e:
self.logger.warning(f"Error resetting USB device (non-fatal): {e}")
Happy to open a PR if you have a preference for how it should be gated (env var, device config flag, or product-ID allowlist).
Summary
configure_virtual_sinks()callsself.usb_device.reset()unconditionally beforekernel_detach(). On the Arctis Nova 7 dongle (1038:22a1,bcdDevice 2.31) that reset leaves the device in a state whereusbhidcan no longer read the HID descriptor on interface 3:The
hidrawnode for that interface disappears,headsetcontrolstops seeing the headset too, and every subsequentSET_REPORTtimes out. Only a physical replug recovers it — a service restart does not, because the reset happens again on each start.Environment
1038:22a1,bcdDevice 2.31Still present on
v2.5.0-beta3— thereset()call is unchanged there.Evidence
The same
-71appears fromkernel_attach()duringteardown(), so once init has failed the interface is left with no driver bound at all:With the reset skipped, init succeeds reliably whenever the headset is powered on — verified with pyusb against the same interface,
SET_REPORTcompleting in ~2 ms.Suggested fix
Make the reset opt-in, or skip it for known-affected product IDs. Local workaround in use here:
Happy to open a PR if you have a preference for how it should be gated (env var, device config flag, or product-ID allowlist).