Fix Goodix fingerprint reader disconnecting when USB-C devices are plugged in or on suspend/resume#5130
Conversation
…ged in Adds a udev rule that forces USB power control to always-on for the Goodix fingerprint reader (27c6:609c), preventing disconnection caused by USB power delivery negotiation when other devices (e.g. phones) are plugged in. Despite the global USB autosuspend being disabled via modprobe, the Goodix driver overrides power management for its own device. The udev rule explicitly enforces power/control=on at the device level, which prevents it from failing to recover during USB-C power negotiation events. This follows the same pattern already used for the Dell XPS haptic touchpad fix. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Adds a udev-based workaround to keep the Goodix (27c6:609c) fingerprint reader from autosuspending, preventing disconnects during USB-C power events (e.g., when plugging in a phone).
Changes:
- Add a udev rule to force
power/control=onfor the Goodix fingerprint device. - Add an install-time hardware script to deploy/reload the rule only when a Goodix device is detected.
- Add a migration + wire the fix into the main hardware setup pipeline.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 5 comments.
| File | Description |
|---|---|
| migrations/1774637906.sh | Runs the new hardware fix for existing installations via migration. |
| install/config/hardware/fix-goodix-fingerprint-usb.sh | Detects the device and installs/reloads the udev rule. |
| install/config/all.sh | Ensures the fix script runs during the standard install/config flow. |
| default/udev/fix-goodix-fingerprint-usb.rules | Implements the udev rule that forces the device to stay powered on. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…d quoting - Check both idVendor and idProduct (27c6:609c) when detecting the device - Add bash shebang to avoid ambiguity with sh execution - Narrow udevadm trigger to USB subsystem + vendor/product match - Match add|change actions in udev rule to cover power management transitions - Quote $OMARCHY_PATH in migration source command Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…sume The Goodix fingerprint reader (27c6:609c) also fails to recover after system suspend with error -EINVAL during async USB resume. Adding the RESET_RESUME quirk (0x0080) forces a full USB reset on wake instead of a soft resume, which resolves the issue. Tested on Framework 13 (AMD Ryzen AI 5 340): closing and reopening the lid now correctly restores fingerprint authentication. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…esume failure The RESET_RESUME quirk (0x0080) prevents disconnects in most cases, but on some resume cycles the device fails with -EINVAL during async PM resume and fully disconnects from the USB bus (error -22). The udev monitor didn't catch this because no standard udev remove event was emitted. This adds a systemd-sleep post-resume hook that detects the absence of the Goodix device after wakeup and forces re-enumeration by rebinding the xhci PCI controller hosting bus 1. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Problem
On Framework laptops (Radeon 860M), the Goodix fingerprint reader (27c6:609c) intermittently
disconnects in two scenarios:
1. USB-C device plugged in —
ucsi_acpierrors trigger a USB reset on bus 1:2. Resume from suspend — the xhci controller hosting bus 1 dies during PM resume, causing
the device to fully disconnect without emitting a standard udev
removeevent:After this,
lsusbno longer shows the device and fingerprint auth is broken until reboot.Fix
For USB-C disconnects: udev rule sets
power/control = onto disable runtime powermanagement on the device, preventing the USB reset from fully dropping it.
For suspend/resume failures: USB quirk
RESET_RESUME (0x0080)handles most resume cycles.For cases where the xhci controller itself dies (as shown above), a
systemd-sleeppost-resumehook detects the missing device and rebinds the xhci PCI controller (
0000:c1:00.4) to forceUSB re-enumeration.
Confirmed working from today's logs (29 March 2026):
Changes
default/udev/99-goodix-fingerprint.rules— disable runtime PM on the devicedefault/modprobe.d/fix-goodix-fingerprint-usb.conf— apply RESET_RESUME quirkdefault/systemd/system-sleep/fix-goodix-fingerprint-resume— post-resume hook to rebindxhci controller when device fails to come back after suspend
install/config/hardware/fix-goodix-fingerprint-usb.sh— deploy all of the abovemigrations/1774637906.sh— apply on existing installsTest plan
lsusb | grep 27c6)journalctl | grep fix-goodix-fingerprint-resumeshows "device present" or "device restored"