From fd4df69975056af150d88f72de1853b58cdfabbb Mon Sep 17 00:00:00 2001 From: Maksim Yevmenkin Date: Sat, 25 Feb 2006 21:59:29 +0000 Subject: [PATCH] Fix hard lockup caused by kbdmux(4) when kbdmux(4), PS/2 keyboard (atkbd(4)) and PS/2 mouse (psm(4)) are used together. Turns out that atkbd(4) check_char() method may return "true" while read_char() method returns NOKEY. When this happens kbdmux(4) was simply stuck in the dead loop. Avoid dead loop in kbdmux(4) by breaking out of the loop if read_char() method returns NOKEY. It almost seems like a bug in atkkbd(4), atkbd_check_char() calls kbdc_data_ready(), and, the later will return "true" if there are pending data in either kbd or aux queue. However, because both aux and kbd are on the same controller, I'm not sure if this is a bug or feature. Tested by: markus MFC after: 1 day --- sys/dev/kbdmux/kbdmux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/dev/kbdmux/kbdmux.c b/sys/dev/kbdmux/kbdmux.c index 8d9979172ad..844baa7aed2 100644 --- a/sys/dev/kbdmux/kbdmux.c +++ b/sys/dev/kbdmux/kbdmux.c @@ -250,7 +250,7 @@ kbdmux_kbd_event(keyboard_t *kbd, int event, void *arg) while (KBDMUX_CHECK_CHAR(kbd)) { c = KBDMUX_READ_CHAR(kbd, 0); if (c == NOKEY) - continue; + break; if (c == ERRKEY) continue; /* XXX ring bell */ if (!KBD_IS_BUSY(kbd))