]> git.proxmox.com Git - mirror_qemu.git/commitdiff
ps2: accept 'Set Key Make and Break' commands
authorSven Schnelle <svens@stackframe.org>
Fri, 20 Dec 2019 21:15:09 +0000 (22:15 +0100)
committerRichard Henderson <richard.henderson@linaro.org>
Mon, 27 Jan 2020 18:49:51 +0000 (10:49 -0800)
HP-UX sends both the 'Set key make and break (0xfc) and
'Set all key typematic make and break' (0xfa). QEMU response
with 'Resend' as it doesn't handle these commands. HP-UX than
reports an PS/2 max retransmission exceeded error. Add these
commands and just reply with ACK.

Signed-off-by: Sven Schnelle <svens@stackframe.org>
Message-Id: <20191220211512.3289-4-svens@stackframe.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
hw/input/ps2.c

index 67f92f611236c26524f22d0e36b505901529bf8e..0b671b6339c42039fa2f0cd791e55d1f3e6569ed 100644 (file)
@@ -49,6 +49,8 @@
 #define KBD_CMD_RESET_DISABLE  0xF5    /* reset and disable scanning */
 #define KBD_CMD_RESET_ENABLE           0xF6    /* reset and enable scanning */
 #define KBD_CMD_RESET          0xFF    /* Reset */
+#define KBD_CMD_SET_MAKE_BREAK  0xFC    /* Set Make and Break mode */
+#define KBD_CMD_SET_TYPEMATIC   0xFA    /* Set Typematic Make and Break mode */
 
 /* Keyboard Replies */
 #define KBD_REPLY_POR          0xAA    /* Power on reset */
@@ -573,6 +575,7 @@ void ps2_write_keyboard(void *opaque, int val)
         case KBD_CMD_SCANCODE:
         case KBD_CMD_SET_LEDS:
         case KBD_CMD_SET_RATE:
+        case KBD_CMD_SET_MAKE_BREAK:
             s->common.write_cmd = val;
             ps2_queue(&s->common, KBD_REPLY_ACK);
             break;
@@ -592,11 +595,18 @@ void ps2_write_keyboard(void *opaque, int val)
                 KBD_REPLY_ACK,
                 KBD_REPLY_POR);
             break;
+        case KBD_CMD_SET_TYPEMATIC:
+            ps2_queue(&s->common, KBD_REPLY_ACK);
+            break;
         default:
             ps2_queue(&s->common, KBD_REPLY_RESEND);
             break;
         }
         break;
+    case KBD_CMD_SET_MAKE_BREAK:
+        ps2_queue(&s->common, KBD_REPLY_ACK);
+        s->common.write_cmd = -1;
+        break;
     case KBD_CMD_SCANCODE:
         if (val == 0) {
             if (s->common.queue.count <= PS2_QUEUE_SIZE - 2) {