diff mbox series

platform/x86: asus-wmi: Fix spurious rfkill on UX8406MA

Message ID 20240823115657.69053-1-mathieu@fenniak.net (mailing list archive)
State Changes Requested, archived
Headers show
Series platform/x86: asus-wmi: Fix spurious rfkill on UX8406MA | expand

Commit Message

Mathieu Fenniak Aug. 23, 2024, 11:56 a.m. UTC
The Asus Zenbook Duo (UX8406MA) has a keyboard which can be
placed on the laptop to connect it via USB, or can be removed from the
laptop to reveal a hidden secondary display in which case the keyboard
operates via Bluetooth.

When it is placed on the secondary display to connect via USB, it emits
a keypress for a wireless disable.  This causes the rfkill system to be
activated disconnecting the current wifi connection, which doesn't
reflect the user's true intention.

Detect this hardware and suppress any wireless switches from the
keyboard; this keyboard does not have a wireless toggle capability so
these presses are always suprious.

Signed-off-by: Mathieu Fenniak <mathieu@fenniak.net>
---
 drivers/platform/x86/asus-nb-wmi.c | 20 +++++++++++++++++++-
 drivers/platform/x86/asus-wmi.h    |  1 +
 2 files changed, 20 insertions(+), 1 deletion(-)

Comments

Ilpo Järvinen Aug. 23, 2024, 1:43 p.m. UTC | #1
On Fri, 23 Aug 2024, Mathieu Fenniak wrote:

> The Asus Zenbook Duo (UX8406MA) has a keyboard which can be
> placed on the laptop to connect it via USB, or can be removed from the
> laptop to reveal a hidden secondary display in which case the keyboard
> operates via Bluetooth.
> 
> When it is placed on the secondary display to connect via USB, it emits
> a keypress for a wireless disable.  This causes the rfkill system to be

One space is enough (the second one might have been auto-added by your 
editor).

> activated disconnecting the current wifi connection, which doesn't
> reflect the user's true intention.
> 
> Detect this hardware and suppress any wireless switches from the
> keyboard; this keyboard does not have a wireless toggle capability so
> these presses are always suprious.

spurious

> 
> Signed-off-by: Mathieu Fenniak <mathieu@fenniak.net>
> ---
>  drivers/platform/x86/asus-nb-wmi.c | 20 +++++++++++++++++++-
>  drivers/platform/x86/asus-wmi.h    |  1 +
>  2 files changed, 20 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c
> index fceffe2082ec..ed3633c5955d 100644
> --- a/drivers/platform/x86/asus-nb-wmi.c
> +++ b/drivers/platform/x86/asus-nb-wmi.c
> @@ -145,6 +145,10 @@ static struct quirk_entry quirk_asus_ignore_fan = {
>  	.wmi_ignore_fan = true,
>  };
>  
> +static struct quirk_entry quirk_asus_zenbook_duo_kbd = {
> +	.ignore_key_wlan = true,
> +};
> +
>  static int dmi_matched(const struct dmi_system_id *dmi)
>  {
>  	pr_info("Identified laptop model '%s'\n", dmi->ident);
> @@ -516,6 +520,15 @@ static const struct dmi_system_id asus_quirks[] = {
>  		},
>  		.driver_data = &quirk_asus_ignore_fan,
>  	},
> +	{
> +		.callback = dmi_matched,
> +		.ident = "ASUS Zenbook Duo UX8406MA",
> +		.matches = {
> +			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
> +			DMI_MATCH(DMI_PRODUCT_NAME, "UX8406MA"),
> +		},
> +		.driver_data = &quirk_asus_zenbook_duo_kbd,
> +	},
>  	{},
>  };
>  
> @@ -630,7 +643,12 @@ static void asus_nb_wmi_key_filter(struct asus_wmi_driver *asus_wmi, int *code,
>  	case 0x32: /* Volume Mute */
>  		if (atkbd_reports_vol_keys)
>  			*code = ASUS_WMI_KEY_IGNORE;
> -
> +		break;
> +	case 0x5D: /* Wireless console Toggle */
> +	case 0x5E: /* Wireless console Enable */
> +	case 0x5F: /* Wireless console Disable */
> +		if (quirks->ignore_key_wlan)
> +			*code = ASUS_WMI_KEY_IGNORE;
>  		break;
>  	}
>  }
> diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h
> index cc30f1853847..a6ee9440d932 100644
> --- a/drivers/platform/x86/asus-wmi.h
> +++ b/drivers/platform/x86/asus-wmi.h
> @@ -50,6 +50,7 @@ struct quirk_entry {
>  	 */
>  	int no_display_toggle;
>  	u32 xusb2pr;
> +	bool ignore_key_wlan;

Please put this next to the other bool values.

Seems fine otherwise so after correcting these small things, you can add:

Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
diff mbox series

Patch

diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c
index fceffe2082ec..ed3633c5955d 100644
--- a/drivers/platform/x86/asus-nb-wmi.c
+++ b/drivers/platform/x86/asus-nb-wmi.c
@@ -145,6 +145,10 @@  static struct quirk_entry quirk_asus_ignore_fan = {
 	.wmi_ignore_fan = true,
 };
 
+static struct quirk_entry quirk_asus_zenbook_duo_kbd = {
+	.ignore_key_wlan = true,
+};
+
 static int dmi_matched(const struct dmi_system_id *dmi)
 {
 	pr_info("Identified laptop model '%s'\n", dmi->ident);
@@ -516,6 +520,15 @@  static const struct dmi_system_id asus_quirks[] = {
 		},
 		.driver_data = &quirk_asus_ignore_fan,
 	},
+	{
+		.callback = dmi_matched,
+		.ident = "ASUS Zenbook Duo UX8406MA",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+			DMI_MATCH(DMI_PRODUCT_NAME, "UX8406MA"),
+		},
+		.driver_data = &quirk_asus_zenbook_duo_kbd,
+	},
 	{},
 };
 
@@ -630,7 +643,12 @@  static void asus_nb_wmi_key_filter(struct asus_wmi_driver *asus_wmi, int *code,
 	case 0x32: /* Volume Mute */
 		if (atkbd_reports_vol_keys)
 			*code = ASUS_WMI_KEY_IGNORE;
-
+		break;
+	case 0x5D: /* Wireless console Toggle */
+	case 0x5E: /* Wireless console Enable */
+	case 0x5F: /* Wireless console Disable */
+		if (quirks->ignore_key_wlan)
+			*code = ASUS_WMI_KEY_IGNORE;
 		break;
 	}
 }
diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h
index cc30f1853847..a6ee9440d932 100644
--- a/drivers/platform/x86/asus-wmi.h
+++ b/drivers/platform/x86/asus-wmi.h
@@ -50,6 +50,7 @@  struct quirk_entry {
 	 */
 	int no_display_toggle;
 	u32 xusb2pr;
+	bool ignore_key_wlan;
 };
 
 struct asus_wmi_driver {