Skip to content

[Bug] Legion Go 2: controller disconnect loop — touchpad matched by BTN_MOUSE but hid-lenovo-go exposes BTN_TOUCH #340

Description

@MasterGenotype

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions