Hatred's Log Place

DON'T PANIC!

Mar 19, 2023 - 2 minute read - Linux Thinkpad

Thinkpad P15 Gen2: отключаем ненужные WakeUp sources

Проблема: просыпается при шевелинии мышкой Logitech MX Master, Unify receiver подключен в правый USB TypeA порт.

Старый метод через /proc/acpi/wakeup работает не для всех устройств:

cat /proc/acpi/wakeup | grep enabled | awk '{print($1)}' | grep -v 'SLPB\|LID' | while read line; do echo $line | sudo tee; done

Читаем:

Просканировать прочие устройства:

find /sys/devices -name 'wakeup' -a -type f | while read line; do sts=$(cat "$line"); echo "$line: $sts"; done | grep enabled

Сверяемся с выводом cat /proc/acpi/wakeup на предмет нужных устройств. К примеру, у меня:

/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00/power/wakeup - LID
/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/power/wakeup - SLPB

И выключаем:

find /sys/devices -name 'wakeup' -a -type f | grep -v 'PNP0C0D:00\|PNP0C0E:00' | while read line; do echo 'disabled' | sudo tee "$line"; done

Отражение состояния в /proc/acpi/wakeup тоже будет.

Но есть нюанс: устройствам может прилететь change и они могут опять включить этот источник пробуждения. Или /etc/rc.local вызваться в момент, когда ещё не все устройства проинициализированы.

Окончательное “лечение” проблемы: через udev, как по ссылке выше. Для себя я составил такой /etc/udev/rules.d/99-wakeup.rules:

ACTION!="add|change|bind", GOTO="wakeup_disable_end"  
  
# Disable all by default  
SUBSYSTEM=="*", ATTR{power/wakeup}=="*", ATTR{power/wakeup}="disabled"  
  
# Enable for selected:  
  
# LID  
#   /sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00  
#DEVPATH=="/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00", ATTR{power/wakeup}="enabled"  
KERNEL=="PNP0C0D:00", ATTR{power/wakeup}="enabled"  
  
# SLPB  
#   cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/uevent  
#DEVPATH=="/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00", ATTR{power/wakeup}="enabled"  
KERNEL=="PNP0C0E:00", ATTR{power/wakeup}="enabled"  
  
LABEL="wakeup_disable_end"

Краткое пояснение:

  1. Реагируем только на действия add, change, bind
  2. По умолчанию, для все подсистем, у которых есть атрибут power/wakeup выставляем его в disable
  3. После чего, включаем только нужные источники пробуждения, у меня это LID и SLPB/WakeUp button.

Далее варианты:

  1. Перегрузиться - самый простой
  2. Вручную перегрузить правила (sudo udevadm control -R) и стригерить каждое устройство:
    sudo udevadm trigger /sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00
    
  3. Так же перечитать правила и вызвать однострочник выше, а если уж прилетит change action, то уже отработается правилами udev.

В общем, какой удобнее - тот и использовать.

Tags: Linux Thinkpad P15Gen2 Suspend Hiberbate

RIP Thinkpad P15 Gen2: LEDs

comments powered by Disqus