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

Input: libps2 - handle 0xfc responses from devices



Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 3eb1aa43
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -262,8 +262,16 @@ int ps2_handle_ack(struct ps2dev *ps2dev, unsigned char data)
			break;

		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;
			}

		/*
		 * 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)
	}


	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_ACK;
	wake_up(&ps2dev->wait);
@@ -329,6 +340,7 @@ void ps2_cmd_aborted(struct ps2dev *ps2dev)
	if (ps2dev->flags & (PS2_FLAG_ACK | PS2_FLAG_CMD))
		wake_up(&ps2dev->wait);

	ps2dev->flags = 0;
	/* reset all flags except last nack */
	ps2dev->flags &= PS2_FLAG_NAK;
}
EXPORT_SYMBOL(ps2_cmd_aborted);
+2 −0
Original line number Diff line number Diff line
@@ -18,11 +18,13 @@
#define PS2_RET_ID		0x00
#define PS2_RET_ACK		0xfa
#define PS2_RET_NAK		0xfe
#define PS2_RET_ERR		0xfc

#define PS2_FLAG_ACK		1	/* Waiting for ACK/NAK */
#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_WAITID		8	/* Command execiting is GET ID */
#define PS2_FLAG_NAK		16	/* Last transmission was NAKed */

struct ps2dev {
	struct serio *serio;