Related: #226 (Legion Go 2 Support tracker)
Summary
On a Lenovo Legion Go 2 (17ef:61eb) using the in-kernel hid-lenovo-go driver, HHD's
Legion Go handler crash-loops every ~3 s with "Assuming controllers disconnected, restarting
after 3s". The controller repeatedly disconnects/reconnects and is unusable in game mode.
Root cause: HHD's d_touch device definition requires the touchpad evdev node to report
BTN_MOUSE (272), but on the Go 2 the hid-lenovo-go driver exposes the touchpad as a real
touchpad reporting BTN_TOUCH (330) instead. The match fails, and because required=True
this raises RuntimeError and restarts the controller forever.
Environment
- Device: Lenovo Legion Go 2 —
17ef:61eb
- HHD:
4.1.8+17.r2628.20260319.52968948 (git)
- Kernel (build & version):
uname -r: 7.2.0-273-tkg-bore
uname -v: #1 SMP PREEMPT_DYNAMIC TKG Thu, 27 Aug 2026 01:57:28 +0000
- Custom linux-tkg (Frogging-Family) build with the BORE scheduler; package
linux72-tkg-bore 7.2.0-273; built with gcc 16.1.1 / binutils 2.46.1.
- HID driver (important): the touchpad is claimed by
hid-lenovo-go ("HID Driver for
Lenovo Legion Go Series Gamepads", author Derek J. Clark), bundled in this TKG kernel
(/lib/modules/7.2.0-273-tkg-bore/kernel/drivers/hid/hid-lenovo-go.ko.zst, owned by
linux72-tkg-bore 7.2.0-273, srcversion E45DE305EDB0FB5D61A7C55). This driver's device
presentation — touchpad as BTN_TOUCH rather than BTN_MOUSE — is central to the bug, so the
exact kernel/driver build matters for reproduction.
- Distro: Artix Linux (runit)
Symptom (HHD log)
LLGO ERROR Device with the following not found:
Vendor ID: ['17ef']
Product ID: ['6182', '61eb']
Name: [re.compile('.+Touchpad')]
Capabilities: {1: [272]} # EV_KEY: BTN_MOUSE
LLGO ERROR <class 'RuntimeError'>:
LLGO ERROR Assuming controllers disconnected, restarting after 3s.
This repeats indefinitely; downstream, Steam Input keeps re-creating its virtual
"Microsoft X-Box 360 pad" on every cycle.
Root cause
hhd/device/legion_go/tablet/base.py, in controller_loop_xinput:
d_touch = GenericGamepadEvdev(
vid=[0x17EF],
pid=[0x6182, 0x61EB],
name=[re.compile(".+Touchpad")],
capabilities={EC("EV_KEY"): [EC("BTN_MOUSE")]}, # requires BTN_MOUSE (272)
...
required=True,
)
But the actual Go 2 touchpad node does not report BTN_MOUSE — it reports BTN_TOUCH:
N: Name=" Legion Controller for Windows Touchpad"
H: Handlers=event4 mouse1
B: KEY=400 1 0 0 0 0 # top word bit 0x400 -> code 330 = BTN_TOUCH; no bit for 272 (BTN_MOUSE)
B: ABS=10000000003 # ABS_X, ABS_Y + MT axis
For comparison, on this device it is the separate Mouse node that carries BTN_MOUSE:
N: Name=" Legion Controller for Windows Mouse"
B: KEY=1f0000 # BTN_LEFT/RIGHT/MIDDLE/SIDE/EXTRA (272–276)
So no single node satisfies both name ~ .+Touchpad and has BTN_MOUSE, and with
required=True the mismatch becomes a fatal restart loop.
This looks like the touchpad definition predates the hid-lenovo-go driver's device
presentation on the Go 2 (original Legion Go exposed the touchpad as a mouse; the Go 2 driver
exposes it as a proper BTN_TOUCH touchpad).
Suggested fix
Match the Go 2 touchpad correctly, e.g. accept BTN_TOUCH for this device (and/or verify the
touchpad axis map for the Go 2). If a separate Go 2 code path is preferred, gate on the
hid-lenovo-go presentation. As a safety measure, consider not making the touchpad
required=True so a touchpad-detection miss degrades gracefully instead of crash-looping the
whole controller.
Workaround (confirmed)
Setting the d_touch entry to required=False stops the loop; the controller (sticks,
buttons, gyro, emulated DualSense) works, only the DualSense touchpad passthrough is lost.
Extra diagnostics available
Happy to provide full hhd logs, the complete /proc/bus/input/devices dump, evtest output
for the touchpad node, or hid-lenovo-go details on request.
Related: #226 (Legion Go 2 Support tracker)
Summary
On a Lenovo Legion Go 2 (
17ef:61eb) using the in-kernelhid-lenovo-godriver, HHD'sLegion Go handler crash-loops every ~3 s with "Assuming controllers disconnected, restarting
after 3s". The controller repeatedly disconnects/reconnects and is unusable in game mode.
Root cause: HHD's
d_touchdevice definition requires the touchpad evdev node to reportBTN_MOUSE(272), but on the Go 2 thehid-lenovo-godriver exposes the touchpad as a realtouchpad reporting
BTN_TOUCH(330) instead. The match fails, and becauserequired=Truethis raises
RuntimeErrorand restarts the controller forever.Environment
17ef:61eb4.1.8+17.r2628.20260319.52968948(git)uname -r:7.2.0-273-tkg-boreuname -v:#1 SMP PREEMPT_DYNAMIC TKG Thu, 27 Aug 2026 01:57:28 +0000linux72-tkg-bore 7.2.0-273; built with gcc 16.1.1 / binutils 2.46.1.hid-lenovo-go("HID Driver forLenovo Legion Go Series Gamepads", author Derek J. Clark), bundled in this TKG kernel
(
/lib/modules/7.2.0-273-tkg-bore/kernel/drivers/hid/hid-lenovo-go.ko.zst, owned bylinux72-tkg-bore 7.2.0-273,srcversion E45DE305EDB0FB5D61A7C55). This driver's devicepresentation — touchpad as
BTN_TOUCHrather thanBTN_MOUSE— is central to the bug, so theexact kernel/driver build matters for reproduction.
Symptom (HHD log)
This repeats indefinitely; downstream, Steam Input keeps re-creating its virtual
"Microsoft X-Box 360 pad" on every cycle.
Root cause
hhd/device/legion_go/tablet/base.py, incontroller_loop_xinput:But the actual Go 2 touchpad node does not report
BTN_MOUSE— it reportsBTN_TOUCH:For comparison, on this device it is the separate Mouse node that carries
BTN_MOUSE:So no single node satisfies both
name ~ .+Touchpadandhas BTN_MOUSE, and withrequired=Truethe mismatch becomes a fatal restart loop.This looks like the touchpad definition predates the
hid-lenovo-godriver's devicepresentation on the Go 2 (original Legion Go exposed the touchpad as a mouse; the Go 2 driver
exposes it as a proper
BTN_TOUCHtouchpad).Suggested fix
Match the Go 2 touchpad correctly, e.g. accept
BTN_TOUCHfor this device (and/or verify thetouchpad axis map for the Go 2). If a separate Go 2 code path is preferred, gate on the
hid-lenovo-gopresentation. As a safety measure, consider not making the touchpadrequired=Trueso a touchpad-detection miss degrades gracefully instead of crash-looping thewhole controller.
Workaround (confirmed)
Setting the
d_touchentry torequired=Falsestops the loop; the controller (sticks,buttons, gyro, emulated DualSense) works, only the DualSense touchpad passthrough is lost.
Extra diagnostics available
Happy to provide full
hhdlogs, the complete/proc/bus/input/devicesdump,evtestoutputfor the touchpad node, or
hid-lenovo-godetails on request.