Commit a2d781fc authored by Dmitry Torokhov's avatar Dmitry Torokhov

Input: libps2 - handle 0xfc responses from devices

Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 3eb1aa43
...@@ -262,8 +262,16 @@ int ps2_handle_ack(struct ps2dev *ps2dev, unsigned char data) ...@@ -262,8 +262,16 @@ int ps2_handle_ack(struct ps2dev *ps2dev, unsigned char data)
break; break;
case PS2_RET_NAK: case PS2_RET_NAK:
ps2dev->nak = 1; ps2dev->flags |= PS2_FLAG_NAK;
ps2dev->nak = PS2_RET_NAK;
break;
case PS2_RET_ERR:
if (ps2dev->flags & PS2_FLAG_NAK) {
ps2dev->flags &= ~PS2_FLAG_NAK;
ps2dev->nak = PS2_RET_ERR;
break; break;
}
/* /*
* Workaround for mice which don't ACK the Get ID command. * Workaround for mice which don't ACK the Get ID command.
...@@ -282,8 +290,11 @@ int ps2_handle_ack(struct ps2dev *ps2dev, unsigned char data) ...@@ -282,8 +290,11 @@ int ps2_handle_ack(struct ps2dev *ps2dev, unsigned char data)
} }
if (!ps2dev->nak && ps2dev->cmdcnt) if (!ps2dev->nak) {
ps2dev->flags &= ~PS2_FLAG_NAK;
if (ps2dev->cmdcnt)
ps2dev->flags |= PS2_FLAG_CMD | PS2_FLAG_CMD1; ps2dev->flags |= PS2_FLAG_CMD | PS2_FLAG_CMD1;
}
ps2dev->flags &= ~PS2_FLAG_ACK; ps2dev->flags &= ~PS2_FLAG_ACK;
wake_up(&ps2dev->wait); wake_up(&ps2dev->wait);
...@@ -329,6 +340,7 @@ void ps2_cmd_aborted(struct ps2dev *ps2dev) ...@@ -329,6 +340,7 @@ void ps2_cmd_aborted(struct ps2dev *ps2dev)
if (ps2dev->flags & (PS2_FLAG_ACK | PS2_FLAG_CMD)) if (ps2dev->flags & (PS2_FLAG_ACK | PS2_FLAG_CMD))
wake_up(&ps2dev->wait); wake_up(&ps2dev->wait);
ps2dev->flags = 0; /* reset all flags except last nack */
ps2dev->flags &= PS2_FLAG_NAK;
} }
EXPORT_SYMBOL(ps2_cmd_aborted); EXPORT_SYMBOL(ps2_cmd_aborted);
...@@ -18,11 +18,13 @@ ...@@ -18,11 +18,13 @@
#define PS2_RET_ID 0x00 #define PS2_RET_ID 0x00
#define PS2_RET_ACK 0xfa #define PS2_RET_ACK 0xfa
#define PS2_RET_NAK 0xfe #define PS2_RET_NAK 0xfe
#define PS2_RET_ERR 0xfc
#define PS2_FLAG_ACK 1 /* Waiting for ACK/NAK */ #define PS2_FLAG_ACK 1 /* Waiting for ACK/NAK */
#define PS2_FLAG_CMD 2 /* Waiting for command to finish */ #define PS2_FLAG_CMD 2 /* Waiting for command to finish */
#define PS2_FLAG_CMD1 4 /* Waiting for the first byte of command response */ #define PS2_FLAG_CMD1 4 /* Waiting for the first byte of command response */
#define PS2_FLAG_WAITID 8 /* Command execiting is GET ID */ #define PS2_FLAG_WAITID 8 /* Command execiting is GET ID */
#define PS2_FLAG_NAK 16 /* Last transmission was NAKed */
struct ps2dev { struct ps2dev {
struct serio *serio; struct serio *serio;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment