Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 09e77c7d authored by Hans de Goede's avatar Hans de Goede Committed by Greg Kroah-Hartman
Browse files

Input: atkbd - skip ATKBD_CMD_SETLEDS when skipping ATKBD_CMD_GETID



commit 683cd8259a9b883a51973511f860976db2550a6e upstream.

After commit 936e4d49ecbc ("Input: atkbd - skip ATKBD_CMD_GETID in
translated mode") the keyboard on Dell XPS 13 9350 / 9360 / 9370 models
has stopped working after a suspend/resume.

The problem appears to be that atkbd_probe() fails when called
from atkbd_reconnect() on resume, which on systems where
ATKBD_CMD_GETID is skipped can only happen by ATKBD_CMD_SETLEDS
failing. ATKBD_CMD_SETLEDS failing because ATKBD_CMD_GETID was
skipped is weird, but apparently that is what is happening.

Fix this by also skipping ATKBD_CMD_SETLEDS when skipping
ATKBD_CMD_GETID.

Fixes: 936e4d49ecbc ("Input: atkbd - skip ATKBD_CMD_GETID in translated mode")
Reported-by: default avatarPaul Menzel <pmenzel@molgen.mpg.de>
Closes: https://lore.kernel.org/linux-input/0aa4a61f-c939-46fe-a572-08022e8931c7@molgen.mpg.de/
Closes: https://bbs.archlinux.org/viewtopic.php?pid=2146300
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218424
Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2260517


Tested-by: default avatarPaul Menzel <pmenzel@molgen.mpg.de>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20240126160724.13278-2-hdegoede@redhat.com


Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a012efe0
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -761,7 +761,6 @@ static int atkbd_probe(struct atkbd *atkbd)
{
	struct ps2dev *ps2dev = &atkbd->ps2dev;
	unsigned char param[2];
	bool skip_getid;

/*
 * Some systems, where the bit-twiddling when testing the io-lines of the
@@ -775,6 +774,11 @@ static int atkbd_probe(struct atkbd *atkbd)
				 "keyboard reset failed on %s\n",
				 ps2dev->serio->phys);

	if (atkbd_skip_getid(atkbd)) {
		atkbd->id = 0xab83;
		return 0;
	}

/*
 * Then we check the keyboard ID. We should get 0xab83 under normal conditions.
 * Some keyboards report different values, but the first byte is always 0xab or
@@ -783,18 +787,17 @@ static int atkbd_probe(struct atkbd *atkbd)
 */

	param[0] = param[1] = 0xa5;	/* initialize with invalid values */
	skip_getid = atkbd_skip_getid(atkbd);
	if (skip_getid || ps2_command(ps2dev, param, ATKBD_CMD_GETID)) {
	if (ps2_command(ps2dev, param, ATKBD_CMD_GETID)) {

/*
 * If the get ID command was skipped or failed, we check if we can at least set
 * 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.
 */
		param[0] = 0;
		if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))
			return -1;
		atkbd->id = skip_getid ? 0xab83 : 0xabba;
		atkbd->id = 0xabba;
		return 0;
	}