You are not logged in.

#1 2021-10-05 07:28:44

wilriker
Member
Registered: 2017-06-18
Posts: 12

Lenovo ThinkPad E15 Gen 2: Fn-Keys only work after wakeup from suspend

Hi there,

I have a problem that I need help with to find a solution.

As stated in the subject I use a Lenovo ThinkPad E15 Gen 2 (AMD Ryzen 4700U) and I can get all my Fn-Keys (or at least those I care about like volume +-, screen brightness +-) to work _after_ I resume from suspend. This additionally affects e.g. the NumLock LED as well as Mic/Audio Mute LEDs which only reflect the current state after resuming from suspend. It does load the "ThinkPad Extra Buttons" already before that as can be seen here

$ rg -F libinput .local/share/xorg/Xorg.0.log
307:[    16.329] (**) Power Button: Applying InputClass "libinput keyboard catchall"
308:[    16.329] (II) LoadModule: "libinput"
309:[    16.329] (II) Loading /usr/lib/xorg/modules/input/libinput_drv.so
310:[    16.332] (II) Module libinput: vendor="X.Org Foundation"
314:[    16.332] (II) Using input driver 'libinput' for 'Power Button'
327:[    16.339] (**) Video Bus: Applying InputClass "libinput keyboard catchall"
328:[    16.339] (II) Using input driver 'libinput' for 'Video Bus'
341:[    16.341] (**) Power Button: Applying InputClass "libinput keyboard catchall"
342:[    16.341] (II) Using input driver 'libinput' for 'Power Button'
358:[    16.346] (**) Sleep Button: Applying InputClass "libinput keyboard catchall"
359:[    16.346] (II) Using input driver 'libinput' for 'Sleep Button'
381:[    16.352] (**) Razer Inc Razer Seiren X Consumer Control: Applying InputClass "libinput keyboard catchall"
382:[    16.352] (II) Using input driver 'libinput' for 'Razer Inc Razer Seiren X Consumer Control'
395:[    16.358] (**) HD Webcam C525: Applying InputClass "libinput keyboard catchall"
396:[    16.358] (II) Using input driver 'libinput' for 'HD Webcam C525'
409:[    16.364] (**) Lenovo ThinkPad USB-C Dock Gen2 USB Audio: Applying InputClass "libinput keyboard catchall"
410:[    16.364] (II) Using input driver 'libinput' for 'Lenovo ThinkPad USB-C Dock Gen2 USB Audio'
423:[    16.370] (**) HID 046a:0023: Applying InputClass "libinput keyboard catchall"
424:[    16.370] (II) Using input driver 'libinput' for 'HID 046a:0023'
437:[    16.379] (**) HID 046a:0023: Applying InputClass "libinput keyboard catchall"
438:[    16.379] (II) Using input driver 'libinput' for 'HID 046a:0023'
446:[    16.384] (II) libinput: HID 046a:0023: needs a virtual subdevice
456:[    16.388] (**) Logitech Anywhere MX: Applying InputClass "libinput pointer catchall"
457:[    16.388] (II) Using input driver 'libinput' for 'Logitech Anywhere MX'
477:[    16.398] (**) Integrated Camera: Integrated C: Applying InputClass "libinput keyboard catchall"
478:[    16.398] (II) Using input driver 'libinput' for 'Integrated Camera: Integrated C'
497:[    16.401] (**) AT Translated Set 2 keyboard: Applying InputClass "libinput keyboard catchall"
498:[    16.401] (II) Using input driver 'libinput' for 'AT Translated Set 2 keyboard'
511:[    16.405] (**) ETPS/2 Elantech Touchpad: Applying InputClass "libinput touchpad catchall"
513:[    16.405] (II) Using input driver 'libinput' for 'ETPS/2 Elantech Touchpad'
533:[    16.410] (II) Using input driver 'libinput' for 'ETPS/2 Elantech Touchpad'
541:[    16.410] (EE) libinput: ETPS/2 Elantech Touchpad: Failed to create a device for /dev/input/mouse1
543:[    16.410] (II) UnloadModule: "libinput"
545:[    16.410] (**) ETPS/2 Elantech TrackPoint: Applying InputClass "libinput pointer catchall"
546:[    16.410] (II) Using input driver 'libinput' for 'ETPS/2 Elantech TrackPoint'
566:[    16.415] (**) ThinkPad Extra Buttons: Applying InputClass "libinput keyboard catchall"
567:[    16.415] (II) Using input driver 'libinput' for 'ThinkPad Extra Buttons'
579:[    16.419] (**) HID 046a:0023: Applying InputClass "libinput keyboard catchall"
580:[    16.419] (II) Using input driver 'libinput' for 'HID 046a:0023'
584:[    16.420] (**) Option "_source" "_driver/libinput"
585:[    16.420] (II) libinput: HID 046a:0023: is a virtual subdevice

and xinput shows it as well

$ xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ HID 046a:0023                             id=14   [slave  pointer  (2)]
⎜   ↳ Logitech Anywhere MX                      id=15   [slave  pointer  (2)]
⎜   ↳ ETPS/2 Elantech Touchpad                  id=18   [slave  pointer  (2)]
⎜   ↳ ETPS/2 Elantech TrackPoint                id=19   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Razer Inc Razer Seiren X Consumer Control id=10   [slave  keyboard (3)]
    ↳ HD Webcam C525                            id=11   [slave  keyboard (3)]
    ↳ Lenovo ThinkPad USB-C Dock Gen2 USB Audio id=12   [slave  keyboard (3)]
    ↳ HID 046a:0023                             id=13   [slave  keyboard (3)]
    ↳ Integrated Camera: Integrated C           id=16   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=17   [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                    id=20   [slave  keyboard (3)]
    ↳ HID 046a:0023                             id=21   [slave  keyboard (3)]

together with its props

$ xinput list-props 20
Device 'ThinkPad Extra Buttons':
        Device Enabled (162):   1
        Coordinate Transformation Matrix (164): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
        libinput Send Events Modes Available (282):     1, 0
        libinput Send Events Mode Enabled (283):        0, 0
        libinput Send Events Mode Enabled Default (284):        0, 0
        Device Node (285):      "/dev/input/event6"
        Device Product ID (286):        6058, 20564

Pressing the Fn key before suspending gives me the following output in xev

KeyPress event, serial 38, synthetic NO, window 0x4000001,
    root 0x6be, subw 0x0, time 1362546, (500,1819), root:(3382,1840),
    state 0x10, keycode 151 (keysym 0x1008ff2b, XF86WakeUp), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 38, synthetic NO, window 0x4000001,
    root 0x6be, subw 0x0, time 1362631, (500,1819), root:(3382,1840),
    state 0x10, keycode 151 (keysym 0x1008ff2b, XF86WakeUp), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

pressing any Fn-related key (like volume up) in combination does not show a different event.
After suspend I see the following (expected) output in xev

KeyPress event, serial 35, synthetic NO, window 0x4000001,
    root 0x6be, subw 0x0, time 1791673, (362,1168), root:(3244,1189),
    state 0x10, keycode 151 (keysym 0x1008ff2b, XF86WakeUp), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyPress event, serial 36, synthetic NO, window 0x4000001,
    root 0x6be, subw 0x0, time 1791737, (362,1168), root:(3244,1189),
    state 0x10, keycode 123 (keysym 0x1008ff13, XF86AudioRaiseVolume), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x4000001,
    root 0x6be, subw 0x0, time 1791824, (362,1168), root:(3244,1189),
    state 0x10, keycode 123 (keysym 0x1008ff13, XF86AudioRaiseVolume), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x4000001,
    root 0x6be, subw 0x0, time 1791926, (362,1168), root:(3244,1189),
    state 0x10, keycode 151 (keysym 0x1008ff2b, XF86WakeUp), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

Outputs of xinput list and xinput list-props do not change as compared to the output before suspend.

Noteworthy might be that some Fn-combinations work though, like Fn-p for Pause, also I have Fn-Lock disabled in BIOS.

I have no idea where to look further what changes with either the process of suspeding and/or resuming (something has to change because it works afterwards) so I could hopefully coerce it into doing the same thing from the first start. Any help appreciated.

Cheers
Manuel

Offline

#2 2021-10-12 20:50:43

tachiorz
Member
Registered: 2021-10-12
Posts: 1

Re: Lenovo ThinkPad E15 Gen 2: Fn-Keys only work after wakeup from suspend

DSDT fix https://github.com/masksshow/Thinkpad-E … -Gen-2-FIX
It feels really wrong, but works okay, no issues.

Offline

#3 2021-10-13 10:33:48

wilriker
Member
Registered: 2017-06-18
Posts: 12

Re: Lenovo ThinkPad E15 Gen 2: Fn-Keys only work after wakeup from suspend

I tried this and indeed it makes the Fn-keys work from the first boot. But then I tried something. I just loaded the original unmodified DSDT that was extracted and it still works. So the point here is to explicitly load the DSDT and not the modification applied by this script.

So is this maybe another hint to anyone? It works without loading the DSDT after resume from suspend. And it works when loading the DSDT dumped via acpidump from the first start. Will suspend and/or resume trigger loading/reevaluating the DSDT?

EDIT: I did forget to power-cylce in between tests and it was not reloading the original DSDT. So in fact the modification did fix it afterall.

Last edited by wilriker (2021-10-13 11:00:37)

Offline

Board footer

Powered by FluxBB