Commit e8688b93 authored by Dmitry Torokhov's avatar Dmitry Torokhov
Browse files

Input: cypress_ps2 - fix error handling when sending command fails



Stop layering error handling in cypress_ps2_sendbyte() and simply
pass on error code from ps2_sendbyte() and use it in the callers.

This fixes mishandling of error condition in
cypress_ps2_read_cmd_status() which expects errors to be negative.

Reported-by: default avatarIgor Artemiev <Igor.A.Artemiev@mcst.ru>
Link: https://lore.kernel.org/r/20240628224728.2180126-2-dmitry.torokhov@gmail.com


Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent c1a33900
Loading
Loading
Loading
Loading
+15 −17
Original line number Diff line number Diff line
@@ -38,15 +38,14 @@ static const unsigned char cytp_resolution[] = {0x00, 0x01, 0x02, 0x03};
static int cypress_ps2_sendbyte(struct psmouse *psmouse, int value)
{
	struct ps2dev *ps2dev = &psmouse->ps2dev;
	int error;

	if (ps2_sendbyte(ps2dev, value & 0xff, CYTP_CMD_TIMEOUT) < 0) {
	error = ps2_sendbyte(ps2dev, value & 0xff, CYTP_CMD_TIMEOUT);
	if (error) {
		psmouse_dbg(psmouse,
				"sending command 0x%02x failed, resp 0x%02x\n",
				value & 0xff, ps2dev->nak);
		if (ps2dev->nak == CYTP_PS2_RETRY)
			return CYTP_PS2_RETRY;
		else
			return CYTP_PS2_ERROR;
			    "sending command 0x%02x failed, resp 0x%02x, error %d\n",
			    value & 0xff, ps2dev->nak, error);
		return error;
	}

#ifdef CYTP_DEBUG_VERBOSE
@@ -73,21 +72,20 @@ static int cypress_ps2_ext_cmd(struct psmouse *psmouse, unsigned short cmd,
		 * to make the device return to the ready state.
		 */
		rc = cypress_ps2_sendbyte(psmouse, cmd & 0xff);
		if (rc == CYTP_PS2_RETRY) {
		if (rc == -EAGAIN) {
			rc = cypress_ps2_sendbyte(psmouse, 0x00);
			if (rc == CYTP_PS2_RETRY)
			if (rc == -EAGAIN)
				rc = cypress_ps2_sendbyte(psmouse, 0x0a);
		}
		if (rc == CYTP_PS2_ERROR)
			continue;

		if (!rc) {
			rc = cypress_ps2_sendbyte(psmouse, data);
		if (rc == CYTP_PS2_RETRY)
			if (rc == -EAGAIN)
				rc = cypress_ps2_sendbyte(psmouse, data);
		if (rc == CYTP_PS2_ERROR)
			continue;
		else

			if (!rc)
				break;
		}
	} while (--tries > 0);

	ps2_end_command(ps2dev);
+0 −6
Original line number Diff line number Diff line
@@ -72,12 +72,6 @@
#define CYTP_DATA_TIMEOUT 30

#define CYTP_EXT_CMD   0xe8
#define CYTP_PS2_RETRY 0xfe
#define CYTP_PS2_ERROR 0xfc

#define CYTP_RESP_RETRY 0x01
#define CYTP_RESP_ERROR 0xfe


#define CYTP_105001_WIDTH  97   /* Dell XPS 13 */
#define CYTP_105001_HIGH   59