From bd37360a210603cb2c27feb7602008c71ca2ab67 Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Wed, 15 Sep 2021 18:37:24 +0200 Subject: [PATCH] hwdb: Permit unsetting power/persist for USB devices The USB persist feature allows devices that can retain their state when powered down to work across suspend/resume. This is in particular useful for USB drives. However, the persist feature can get in the way for devices that are unable to retain their state when power is lost. An example of such stateful devices are fingerprint readers where USB persist should be disabled to ensure userspace can detect whether the USB device had a power loss during system suspend. This will initially be used by the libfprint autosuspend hwdb. Closes: #20754 --- hwdb.d/60-autosuspend.hwdb | 7 +++++++ hwdb.d/parse_hwdb.py | 1 + rules.d/60-autosuspend.rules | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/hwdb.d/60-autosuspend.hwdb b/hwdb.d/60-autosuspend.hwdb index 15dcc2f1eef..e9304f440de 100644 --- a/hwdb.d/60-autosuspend.hwdb +++ b/hwdb.d/60-autosuspend.hwdb @@ -24,6 +24,13 @@ # # Allowed properties are: # ID_AUTOSUSPEND=1 +# ID_PERSIST=0 +# +# ID_PERSIST=0 allows disabling the kernels USB "persist" feature, which allows +# the continued use of devices after a power loss (due to suspend). Disable it +# if the device will loose state without a USB power session and the driver +# is unable to recover the state when resuming. See +# https://www.kernel.org/doc/html/latest/driver-api/usb/persist.html # Sort by brand, model diff --git a/hwdb.d/parse_hwdb.py b/hwdb.d/parse_hwdb.py index dea71acfe93..f385e526281 100755 --- a/hwdb.d/parse_hwdb.py +++ b/hwdb.d/parse_hwdb.py @@ -134,6 +134,7 @@ def property_grammar(): ('MOUSE_WHEEL_CLICK_COUNT', INTEGER), ('MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL', INTEGER), ('ID_AUTOSUSPEND', Or((Literal('0'), Literal('1')))), + ('ID_PERSIST', Or((Literal('0'), Literal('1')))), ('ID_INPUT', Or((Literal('0'), Literal('1')))), ('ID_INPUT_ACCELEROMETER', Or((Literal('0'), Literal('1')))), ('ID_INPUT_JOYSTICK', Or((Literal('0'), Literal('1')))), diff --git a/rules.d/60-autosuspend.rules b/rules.d/60-autosuspend.rules index 1f9ebef631d..332d052caa3 100644 --- a/rules.d/60-autosuspend.rules +++ b/rules.d/60-autosuspend.rules @@ -11,4 +11,8 @@ SUBSYSTEM=="i2c", ATTR{name}=="cyapa", \ ENV{ID_AUTOSUSPEND}=="1", TEST=="power/control", \ ATTR{power/control}="auto" +# Disable USB persist if hwdb says so. +ENV{ID_PERSIST}=="0", TEST=="power/persist", \ + ATTR{power/persist}="0" + LABEL="autosuspend_end"