]> www.infradead.org Git - linux.git/commitdiff
Input: cypress_ps2 - fix error handling when sending command fails
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 28 Jun 2024 22:47:24 +0000 (15:47 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 3 Jul 2024 20:48:53 +0000 (13:48 -0700)
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: Igor Artemiev <Igor.A.Artemiev@mcst.ru>
Link: https://lore.kernel.org/r/20240628224728.2180126-2-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/mouse/cypress_ps2.c
drivers/input/mouse/cypress_ps2.h

index 32b55b2b9b763abfc3c35f7453f5809d6271e422..fcc3921e49e0f2726e08e25a8d75f77395c405d4 100644 (file)
@@ -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;
 
-               rc = cypress_ps2_sendbyte(psmouse, data);
-               if (rc == CYTP_PS2_RETRY)
+               if (!rc) {
                        rc = cypress_ps2_sendbyte(psmouse, data);
-               if (rc == CYTP_PS2_ERROR)
-                       continue;
-               else
-                       break;
+                       if (rc == -EAGAIN)
+                               rc = cypress_ps2_sendbyte(psmouse, data);
+
+                       if (!rc)
+                               break;
+               }
        } while (--tries > 0);
 
        ps2_end_command(ps2dev);
index bb4979d06bf994e320df80fcd69fb623d5be6a55..47d538a490898d2fcd421de7f868318be9de0d3e 100644 (file)
 #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