Laptop Mode Tools revisited due to a change in its functionality
October 22, 2014 3 Comments
The site statistics for this blog can be quite revealing. For example, over the last two or three months I noticed that my post How to prevent a USB mouse auto-suspending in Linux when a laptop’s power supply is disconnected has consistently been one of the most viewed. Given the problems I experienced with Laptop Mode Tools 1.65 (see my Gentoo Linux Forums post Bug in laptop-mode-tools-1.65? and Gentoo Linux Bugzilla Bug Report No. 520124), I was not entirely surprised. Thanks to fellow Gentoo Linux and Laptop Mode Tools user Ted Tanberry I learned that Version 1.65 had stopped using Laptop Mode Tools module usb-autosuspend
, and started using Laptop Mode Tools module runtime-pm
instead. At least that was the developer’s intention, but he had not implemented it correctly. The aforementioned Gentoo Linux bug report explains in detail the problem with Version 1.65.
The situation in my Gentoo Linux installation with laptop-mode-tools-1.64 installed, providing the functionality I desired, was as follows:
a. The precise package installed:
# eix -I laptop-mode-tools
[U] app-laptop/laptop-mode-tools
Available versions: 1.64 (~)1.65 (~)1.65-r1 (~)1.66 {+acpi apm bluetooth scsi}
Installed versions: 1.64(10:04:43 21/10/14)(acpi bluetooth -apm -scsi)
Homepage: http://www.samwel.tk/laptop_mode/
Description: Linux kernel laptop_mode user-space utilities
b. The auto-suspend state when the laptop PSU was connected:
# for d in /sys/bus/usb/devices/[0-9]* ; do if [[ -e $d/product ]] ; then echo -e "`basename $d`\t`cat $d/power/control`\t`cat $d/speed`\t`cat $d/product`" ; fi ; done
1-1.2 on 1.5 USB Laser Mouse
2-1.2 on 12 Fingerprint Sensor
2-1.3 on 480 USB 2.0 Camera
c. The contents of the file /lib64/udev/rules.d/99-laptop-mode.rules
:
ACTION=="change", SUBSYSTEM=="power_supply", RUN+="lmt-udev auto" ACTION=="add|remove", SUBSYSTEM=="machinecheck", RUN+="lmt-udev auto" ACTION=="add|remove", SUBSYSTEM=="usb", RUN+="lmt-udev force modules=usb-autosuspend devices=%k"
d. The contents of file /etc/laptop-mode/conf.d/usb-autosuspend.conf
:
# # Configuration file for Laptop Mode Tools module usb-autosuspend. # # For more information, consult the laptop-mode.conf(8) manual page. # ############################################################################### # USB autosuspend settings # ------------------------ # # If you enable this setting, laptop mode tools will automatically enable the # USB autosuspend feature for all devices. # # NOTE: Some USB devices claim they support autosuspend, but implement it in a # broken way. This can mean keyboards losing keypresses, or optical mice turning # their LED completely off. If you have a device that misbehaves, add its USB ID # to the blacklist below and complain to your hardware vendor. ################################################################################ # Enable debug mode for this module # Set to 1 if you want to debug this module DEBUG=0 # Enable USB autosuspend feature? # Set to 0 to disable CONTROL_USB_AUTOSUSPEND="auto" # Set this to use opt-in/whitelist instead of opt-out/blacklist for deciding # which USB devices should be autosuspended. # AUTOSUSPEND_USE_WHITELIST=0 means AUTOSUSPEND_*_BLACKLIST will be used. # AUTOSUSPEND_USE_WHITELIST=1 means AUTOSUSPEND_*_WHITELIST will be used. AUTOSUSPEND_USE_WHITELIST=0 # The list of USB IDs that should not use autosuspend. Use lsusb to find out the # IDs of your USB devices. # Example: AUTOSUSPEND_USBID_BLACKLIST="046d:c025 0123:abcd" AUTOSUSPEND_USBID_BLACKLIST="046d:c052" # The list of USB driver types that should not use autosuspend. The driver # type is given by "DRIVER=..." in a USB device's uevent file. # Example: AUTOSUSPEND_USBID_BLACKLIST="usbhid usb-storage" AUTOSUSPEND_USBTYPE_BLACKLIST="" # The list of USB IDs that should use autosuspend. Use lsusb to find out the # IDs of your USB devices. # Example: AUTOSUSPEND_USBID_WHITELIST="046d:c025 0123:abcd" AUTOSUSPEND_USBID_WHITELIST="" # The list of USB driver types that should use autosuspend. The driver # type is given by "DRIVER=..." in a USB device's uevent file. # Example: AUTOSUSPEND_USBTYPE_WHITELIST="usbhid usb-storage" AUTOSUSPEND_USBTYPE_WHITELIST="" # Trigger auto-suspension of the USB deivce under conditional circumstances BATT_SUSPEND_USB=1 LM_AC_SUSPEND_USB=0 NOLM_AC_SUSPEND_USB=0 # USB Auto-Suspend timeout in seconds # Number of seconds after which the USB devices should suspend AUTOSUSPEND_TIMEOUT=2
Having experienced the problems with the buggy Laptop Mode Tools 1.65, I re-installed 1.64 and had been using that successfully until a week ago. Then I noticed that 1.66 had been released, so I installed it:
# emerge laptop-mode-tools
.
.
.
>>> Installing (1 of 1) app-laptop/laptop-mode-tools-1.66::gentoo
* To enable automatic power state event handling,
* e.g. enabling laptop_mode after unplugging the battery,
* both laptop_mode and the acpid daemon must be
* added to default runlevel:
* # rc-update add laptop_mode default
>>> Auto-cleaning packages...
>>> No outdated packages were found on your system.
* GNU info directory index is up-to-date.
I would not have expected that ewarn message about adding laptop_mode
to the default
runlevel, as the ebuild is only supposed to display the warning if laptop_mode
is not assigned to the default
runlevel. But, sure enough, something had removed it:
# rc-update show -v | grep laptop
laptop_mode |
# rc-update show -v | grep acpi
acpid | default
I don’t know what removed laptop_mode
from the default
runlevel. It was certainly assigned previously, as proved by Laptop Mode Tools 1.64 working as expected when I connected and disconnected the laptop’s PSU from the mains (see my earlier post). Anyway, I re-added it:
# rc-update add laptop_mode default
* service laptop_mode added to runlevel default
If you use systemd instead of OpenRC, instead of adding laptop_mode
to the default
runlevel you would need to use the following command:
# systemctl enable laptop_mode.service
Notice that the incorrect contents of 99-laptop-mode.rules
and /etc/laptop-mode/laptop-mode.conf
that were present in Laptop Mode Tools 1.65 have been fixed in 1.66:
# cat /lib64/udev/rules.d/99-laptop-mode.rules
ACTION=="change", SUBSYSTEM=="power_supply", RUN+="lmt-udev auto"
ACTION=="add|remove", SUBSYSTEM=="machinecheck", RUN+="lmt-udev auto force"
ACTION=="add|remove", SUBSYSTEM=="usb", RUN+="lmt-udev force modules=runtime-pm devices=%k"
# cat /etc/laptop-mode/laptop-mode.conf | grep usb-autosuspend
#
The ebuild for Laptop Mode Tools 1.66 did not delete the now-redundant file /etc/laptop-mode/conf.d/usb-autosuspend.conf
but it is presumably ignored by 1.66 anyway.
From now on I must configure the contents of /etc/laptop-mode/conf.d/runtime-pm.conf
instead. After installing Laptop Mode Tools 1.66 it contained the following:
# # Configuration file for Laptop Mode Tools module runtime-pm # # For more information, consult the laptop-mode.conf(8) manual page. # ############################################################################### # Runtime Power Management Settings # --------------------------------- # #__COMMENT If you enable this setting, laptop mode tools will automatically enable #__COMMENT the Runtime Power Management feature for all devices. #__COMMENT #__COMMENT NOTE: Some devices claim they support autosuspend, but implement it in a #__COMMENT broken way. This can mean keyboards losing keypresses, or optical mice #__COMMENT turning their LED completely off. If you have a device that misbehaves, #__COMMENT add its DEVICE ID to the blacklist section below and complain to your #__COMMENT hardware / device driver contact # ################################################################################ # Enable debug mode for this module # Set to 1 if you want to debug this module DEBUG=0 # Enable Runtime autosuspend feature? # Set to 0 to disable CONTROL_RUNTIME_AUTOSUSPEND=1 # Set this to use opt-in/whitelist instead of opt-out/blacklist for deciding # which devices should be autosuspended. # AUTOSUSPEND_USE_WHITELIST=0 means AUTOSUSPEND_*_BLACKLIST will be used. # AUTOSUSPEND_USE_WHITELIST=1 means AUTOSUSPEND_*_WHITELIST will be used. AUTOSUSPEND_USE_WHITELIST=0 # The list of Device IDs that should not use autosuspend. Use system commands or # look into sysfs to find out the IDs of your devices. # Example: AUTOSUSPEND_DEVID_BLACKLIST="046d:c025 0123:abcd" AUTOSUSPEND_RUNTIME_DEVID_BLACKLIST="" # The list of device driver types that should not use autosuspend. The driver # type is given by "DRIVER=..." in a device's uevent file. # Example: AUTOSUSPEND_DEVID_BLACKLIST="usbhid usb-storage" AUTOSUSPEND_RUNTIME_DEVTYPE_BLACKLIST="" # The list of Device IDs that should use autosuspend. Use system commands or # look into sysfs to find out the IDs of your devices. # Example: AUTOSUSPEND_DEVID_WHITELIST="046d:c025 0123:abcd" AUTOSUSPEND_RUNTIME_DEVID_WHITELIST="" # The list of device driver types that should use autosuspend. The driver # type is given by "DRIVER=..." in a device's uevent file. # Example: AUTOSUSPEND_DEVTYPE_WHITELIST="usbhid usb-storage" AUTOSUSPEND_RUNTIME_DEVTYPE_WHITELIST="" # Trigger auto-suspension of the deivce under conditional circumstances # Warning: DO NOT CHANGE THESE DEFAUTLS UNLESS YOU KNOW BATT_SUSPEND_RUNTIME=1 LM_AC_SUSPEND_RUNTIME=1 NOLM_AC_SUSPEND_RUNTIME=1 # Auto-Suspend timeout in seconds # Number of seconds after which the USB devices should suspend AUTOSUSPEND_TIMEOUT=2
So, in order to stop my laptop’s USB mouse, USB external keyboard and some internal USB devices from going to sleep when my laptop is only on battery power, I made the following change to a line in /etc/laptop-mode/conf.d/runtime-pm.conf
:
# External keyboard at one office, internal Webcam, internal fingerprint sensor, Logitek NX50 notebook mouse AUTOSUSPEND_RUNTIME_DEVID_BLACKLIST="03f0:0024 064e:a115 147e:1001 046d:c052"
My earlier post about Laptop Mode Tools explained one method for finding the device ID for each USB device, but the lsusb command can also be used:
# lsusb
Bus 002 Device 005: ID 03f0:0024 Hewlett-Packard KU-0316 Keyboard <---- External keyboard at one office
Bus 002 Device 004: ID 064e:a115 Suyin Corp. <---- Built-in Webcam
Bus 002 Device 003: ID 147e:1001 Upek TCS5B Fingerprint sensor <---- Built-in fingerprint sensor
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 046d:c052 Logitech, Inc. <----Logitech NX50 notebook mouse
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Although the Laptop Mode Tools usb-autosuspend
module is supposed to be unused in 1.66, I edited /etc/laptop-mode/conf.d/usb-autosuspend.conf
(which was not deleted by the 1.66 ebuild) and changed CONTROL_USB_AUTOSUSPEND="auto"
to CONTROL_USB_AUTOSUSPEND="0"
just to be on the safe side.