Fedora 30@ThinkPad T490s: Suspend Error

Nach der Installation von Fedora 30 und TLP auf dem Lenovo ThinkPad T490s funktioniert der Wechsel in den Standby (Suspend to RAM; STR) beim Schließen des Notebookdeckels oder Nutzung des Suspend-Buttons nicht. Stattdessen gibt es nur eine Fehlermeldung im Journal:

pci_pm_suspend(): hcd_pci_suspend+0x0/0x30 returns -16
dpm_run_callback(): pci_pm_suspend+0x0/0x170 returns -16
PM: Device 0000:00:14.0 failed to suspend async: error -16
PM: Some devices failed to suspend, or early wake event detected

Um diesen Fehler im xhci Controller zu beheben, muss nur eine Datei, etwa mit dem Namen „xhci.sh“, im Verzeichnis „/usr/lib/systemd/system-sleep/“ mit dem folgenden Inhalt angelegt werden:

#!/bin/sh

if [ "${1}" == "pre" ]; then
  # Do the thing you want before suspend here, e.g.:
  echo "Disable broken xhci module before suspending at $(date)..." > /tmp/systemd_suspend_test
  grep XHC.*enable /proc/acpi/wakeup && echo XHC > /proc/acpi/wakeup
elif [ "${1}" == "post" ]; then
  # Do the thing you want after resume here, e.g.:
  echo "Enable broken xhci module at wakeup from $(date)" >> /tmp/systemd_suspend_test
  grep XHC.*disable /proc/acpi/wakeup && echo XHC > /proc/acpi/wakeup
fi

Anschließend die Datei noch ausführbar machen:

sudo chmod +x /usr/lib/systemd/system-sleep/xhci.sh

Im Anschluss sollte sich das ThinkPad T490s normal in den Standby versetzen lassen. Der Batterieverbrauch liegt dann etwa bei 15% innerhalb von 24 Stunden, was zu einer Standbyzeit von etwa 6,7 Tagen führt.

Quellen:

ThinkPad t480s – UEFI/BIOS Firmware Update@GNU/Linux

Vorbei sind die Zeiten, in denen man für ein BIOS-Update mal kurz Windows installieren musste (oder zumindest über den Umwege eins bootfähigen Mediums zum Updaten angewiesen war). Der Dank dafür gilt dem LVFS – dem Linux Vendor Firmware Service. Damit LVFS ans Werk gehen kann, muss er aber erstmal unterstützt werden.

Das Lenovo ThinkPad t480s versteht LVFS und mit GNOME@Fedora 29 werden verfügbare Updates für UEFI/BIOS und andere Firmware einfach über „Software“ unter dem Reiter „Aktualisierungen“ angezeigt. Ein Klick auf Installieren und das Update startet. Oder auch nicht. Einige Dinge sind dann doch noch zu beachten:

  1. Das Lenovo ThinkPad t480s muss mit dem Strom verbunden sein.
  2. Das UEFI/BIOS darf nicht mit einem Passwort geschützt sein.

In meiner Konfiguration ist es dann aber doch nötig New Brunswick find phone , selber Hand anzulegen. Zunächst zur Konfiguration:

  • Fedora 29 64bit mit Kernel 5.0.4-200
  • Secure Boot AN
  • Normale LUKS-Komplettverschlüsselung (also ohne /boot)

Damit kommt es bei mir zu folgendem Fehlerbild: Über Software wird das Update angezeigt und die Installation startet auch, aber der nötige Neustart wird nicht automatisch ausgeführt. Ein selber initiierter Neustart läuft normal durch, ohne, dass das UEFI/BIOS sich updatet. Die Nachfrage bei fwupdmgr zeigt weiterhin „reboot pending“ an.

Die Lösung: etwas Gewalt

sudo fwupdmgr --force update

So konnte ich problemlos von 1.27 auf 1.29 und von 1.29 auf 1.30 updaten.

Abschließend nicht vergessen, das UEFI/BIOS-Passwort wieder zu setzen!

GNU/Linux@Dell Latitude 7490: Scrollen mit mittlerer TrackStick-Taste

Im Gegensatz zu den TrackPoints bei Lenovo Notebooks kann der TrackStick des Dell Latitude 7490 nicht ohne Anpassungen in Kombination mit der mittleren TrackStick-Taste zum Scrollen benutzt werden. Es gibt aber sowohl für X11 als auch Wayland eine Möglichkeit, dem Latitutde middle-button-scroll beizubringen. Bei mir funktioniert beides unter Fedora 29.

Unter X11

Wer noch X11 nutzt, hat es am Einfachsten. Hier muss nur eine Konfiguration für libinput erstellt werden. Also einfach den folgenden Inhalt kopieren und als Datei unter „/etc/X11/xorg.conf.d/40-libinput-trackpoint.conf“ oder „/usr/share/X11/xorg.conf.d/40-libinput-trackpoint.conf“ speichern.

Datei „40-libinput-trackpoint.conf“

Section "InputClass"
        Identifier "Trackpoint Scroll"          
        MatchIsPointer "on"                    
        MatchDevicePath "/dev/input/event*"  
        Option "ScrollMethod" "button"
        Option "ScrollButton" "2"
        Driver "libinput"                          
EndSection

Wer statt libinput lieber evdev nutzen möchte, findet bei Francesco Provino eine alternative Konfiguration.

Credit/Quelle: askubuntu.com


Unter Wayland

Unter Wayland ist eine einfache Anassung per libinput Konfiguration nicht möglich. PeterCyx hat aber eine (vielleicht nicht unbedingt schönen, aber funktionierenden) Workaround gefunden. Dafür den folgenden Inhalt als Datei unter „/usr/lib/hook/hook.c“ speichern.

Datei „hook.c“

#define _GNU_SOURCE
#include <dlfcn.h>
#include <libinput.h>

typedef const char* (*orig_get_name_t)(struct libinput_device *device);

const char* libinput_device_get_name(struct libinput_device *device) {
  set_scroll_emulation(device); // Inject the code to set scrolling emulation
  orig_get_name_t orig_get_name;
  orig_get_name = (orig_get_name_t) dlsym(RTLD_NEXT, "libinput_device_get_name");
  return orig_get_name(device);
}

void set_scroll_emulation(struct libinput_device *device) {
  libinput_device_config_middle_emulation_set_enabled(device, LIBINPUT_CONFIG_MIDDLE_EMULATION_ENABLED);
  libinput_device_config_scroll_set_method(device, LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN);
  libinput_device_config_scroll_set_button(device, 2);
}

Als nächstes müssen die zum Kompilieren noch fehlenden Dateien nachinstallierte werden. Anschließend den Kompilierbefehl ausführen.

sudo dnf install libinput-devel libudev-devel
sudo gcc -shared -ldl -linput -fPIC hook.c -o hook.so

Jetzt noch den folgenden Inhalt zum Einbinden der Library in der Datei „/etc/profile.d/libinput.sh“ speichern.

Datei „libinput.sh“

export LD_PRELOAD="$LD_PRELOAD /usr/lib/hook/hook.so"

Nach einem Neustart sollte jetzt das Scrollen mittels mittlerem TrackStick-Button problemlos funktionieren.

Credit/Quelle: PeterCyx