Patch "Input: atkbd - skip ATKBD_CMD_GETID in translated mode" has been added to the 4.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    Input: atkbd - skip ATKBD_CMD_GETID in translated mode

to the 4.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     input-atkbd-skip-atkbd_cmd_getid-in-translated-mode.patch
and it can be found in the queue-4.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f94c82ee75ff3331b167a5bbec3d50eb1844ef5f
Author: Hans de Goede <hdegoede@xxxxxxxxxx>
Date:   Fri Nov 24 19:59:24 2023 -0800

    Input: atkbd - skip ATKBD_CMD_GETID in translated mode
    
    [ Upstream commit 936e4d49ecbc8c404790504386e1422b599dec39 ]
    
    There have been multiple reports of keyboard issues on recent laptop models
    which can be worked around by setting i8042.dumbkbd, with the downside
    being this breaks the capslock LED.
    
    It seems that these issues are caused by recent laptops getting confused by
    ATKBD_CMD_GETID. Rather then adding and endless growing list of quirks for
    this, just skip ATKBD_CMD_GETID alltogether on laptops in translated mode.
    
    The main goal of sending ATKBD_CMD_GETID is to skip binding to ps/2
    mice/touchpads and those are never used in translated mode.
    
    Examples of laptop models which benefit from skipping ATKBD_CMD_GETID:
    
    * "HP Laptop 15s-fq2xxx", "HP laptop 15s-fq4xxx" and "HP Laptop 15-dy2xxx"
      models the kbd stops working for the first 2 - 5 minutes after boot
      (waiting for EC watchdog reset?)
    
    * On "HP Spectre x360 13-aw2xxx" atkbd fails to probe the keyboard
    
    * At least 9 different Lenovo models have issues with ATKBD_CMD_GETID, see:
      https://github.com/yescallop/atkbd-nogetid
    
    This has been tested on:
    
    1. A MSI B550M PRO-VDH WIFI desktop, where the i8042 controller is not
       in translated mode when no keyboard is plugged in and with a ps/2 kbd
       a "AT Translated Set 2 keyboard" /dev/input/event# node shows up
    
    2. A Lenovo ThinkPad X1 Yoga gen 8 (always has a translated set 2 keyboard)
    
    Reported-by: Shang Ye <yesh25@xxxxxxxxxxxxxxxxx>
    Closes: https://lore.kernel.org/linux-input/886D6167733841AE+20231017135318.11142-1-yesh25@xxxxxxxxxxxxxxxxx/
    Closes: https://github.com/yescallop/atkbd-nogetid
    Reported-by: gurevitch <mail@xxxxxxxxxx>
    Closes: https://lore.kernel.org/linux-input/2iAJTwqZV6lQs26cTb38RNYqxvsink6SRmrZ5h0cBUSuf9NT0tZTsf9fEAbbto2maavHJEOP8GA1evlKa6xjKOsaskDhtJWxjcnrgPigzVo=@gurevit.ch/
    Reported-by: Egor Ignatov <egori@xxxxxxxxxxxx>
    Closes: https://lore.kernel.org/all/20210609073333.8425-1-egori@xxxxxxxxxxxx/
    Reported-by: Anton Zhilyaev <anton@xxxxxx>
    Closes: https://lore.kernel.org/linux-input/20210201160336.16008-1-anton@xxxxxx/
    Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2086156
    Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20231115174625.7462-1-hdegoede@xxxxxxxxxx
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
index 7e75835e220f..e6d3a56366c5 100644
--- a/drivers/input/keyboard/atkbd.c
+++ b/drivers/input/keyboard/atkbd.c
@@ -717,6 +717,44 @@ static void atkbd_deactivate(struct atkbd *atkbd)
 			ps2dev->serio->phys);
 }
 
+#ifdef CONFIG_X86
+static bool atkbd_is_portable_device(void)
+{
+	static const char * const chassis_types[] = {
+		"8",	/* Portable */
+		"9",	/* Laptop */
+		"10",	/* Notebook */
+		"14",	/* Sub-Notebook */
+		"31",	/* Convertible */
+		"32",	/* Detachable */
+	};
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(chassis_types); i++)
+		if (dmi_match(DMI_CHASSIS_TYPE, chassis_types[i]))
+			return true;
+
+	return false;
+}
+
+/*
+ * On many modern laptops ATKBD_CMD_GETID may cause problems, on these laptops
+ * the controller is always in translated mode. In this mode mice/touchpads will
+ * not work. So in this case simply assume a keyboard is connected to avoid
+ * confusing some laptop keyboards.
+ *
+ * Skipping ATKBD_CMD_GETID ends up using a fake keyboard id. Using a fake id is
+ * ok in translated mode, only atkbd_select_set() checks atkbd->id and in
+ * translated mode that is a no-op.
+ */
+static bool atkbd_skip_getid(struct atkbd *atkbd)
+{
+	return atkbd->translated && atkbd_is_portable_device();
+}
+#else
+static inline bool atkbd_skip_getid(struct atkbd *atkbd) { return false; }
+#endif
+
 /*
  * atkbd_probe() probes for an AT keyboard on a serio port.
  */
@@ -746,12 +784,12 @@ static int atkbd_probe(struct atkbd *atkbd)
  */
 
 	param[0] = param[1] = 0xa5;	/* initialize with invalid values */
-	if (ps2_command(ps2dev, param, ATKBD_CMD_GETID)) {
+	if (atkbd_skip_getid(atkbd) || ps2_command(ps2dev, param, ATKBD_CMD_GETID)) {
 
 /*
- * If the get ID command failed, we check if we can at least set the LEDs on
- * the keyboard. This should work on every keyboard out there. It also turns
- * the LEDs off, which we want anyway.
+ * If the get ID command was skipped or failed, we check if we can at least set
+ * the LEDs on the keyboard. This should work on every keyboard out there.
+ * It also turns the LEDs off, which we want anyway.
  */
 		param[0] = 0;
 		if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux