]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
platform/x86: wmi: Fix WMI event enablement
authorArmin Wolf <W_Armin@gmx.de>
Thu, 19 Jun 2025 22:14:39 +0000 (00:14 +0200)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Thu, 26 Jun 2025 15:19:24 +0000 (18:19 +0300)
It turns out that the Windows WMI-ACPI driver always enables/disables
WMI events regardless of whether they are marked as expensive or not.
This finding is further reinforced when reading the documentation of
the WMI_FUNCTION_CONTROL_CALLBACK callback used by Windows drivers
for enabling/disabling WMI devices:

The DpWmiFunctionControl routine enables or disables
notification of events, and enables or disables data
collection for data blocks that the driver registered
as expensive to collect.

Follow this behavior to fix the WMI event used for reporting hotkey
events on the Dell Latitude 5400 and likely many more devices.

Reported-by: Dmytro Bagrii <dimich.dmb@gmail.com>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220246
Tested-by: Dmytro Bagrii <dimich.dmb@gmail.com>
Fixes: 656f0961d126 ("platform/x86: wmi: Rework WCxx/WExx ACPI method handling")
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
Link: https://lore.kernel.org/r/20250619221440.6737-1-W_Armin@gmx.de
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/wmi.c

index e46453750d5f1475eb87342b1c5fd04fe20df335..03aecf8bb7f8efd1cd52851aa2ea2aa2e5bf2a19 100644 (file)
@@ -177,16 +177,22 @@ static int wmi_device_enable(struct wmi_device *wdev, bool enable)
        acpi_handle handle;
        acpi_status status;
 
-       if (!(wblock->gblock.flags & ACPI_WMI_EXPENSIVE))
-               return 0;
-
        if (wblock->dev.dev.type == &wmi_type_method)
                return 0;
 
-       if (wblock->dev.dev.type == &wmi_type_event)
+       if (wblock->dev.dev.type == &wmi_type_event) {
+               /*
+                * Windows always enables/disables WMI events, even when they are
+                * not marked as being expensive. We follow this behavior for
+                * compatibility reasons.
+                */
                snprintf(method, sizeof(method), "WE%02X", wblock->gblock.notify_id);
-       else
+       } else {
+               if (!(wblock->gblock.flags & ACPI_WMI_EXPENSIVE))
+                       return 0;
+
                get_acpi_method_name(wblock, 'C', method);
+       }
 
        /*
         * Not all WMI devices marked as expensive actually implement the