summaryrefslogtreecommitdiffstats
path: root/sys/dev/kbdmux
diff options
context:
space:
mode:
authoremax <emax@FreeBSD.org>2006-07-27 20:33:48 +0000
committeremax <emax@FreeBSD.org>2006-07-27 20:33:48 +0000
commit6e9eacd766ebc1ee97172cd621ef3ead709ebd24 (patch)
tree441a41bbe6a7393f9f016bc1c1fb3c14d446ad55 /sys/dev/kbdmux
parent15daf52a2d9bfd76672fc6479cfe82c9744ee475 (diff)
downloadFreeBSD-src-6e9eacd766ebc1ee97172cd621ef3ead709ebd24.zip
FreeBSD-src-6e9eacd766ebc1ee97172cd621ef3ead709ebd24.tar.gz
Add extra code into kbdmux(4)s read_char() method to
poll (i.e. call read_char() method) slave keyboards. This workaround should fix problem with kbdmux(4) and atkbd(4) not working in ddb(4) and mid-boot. MFC after: 1 week
Diffstat (limited to 'sys/dev/kbdmux')
-rw-r--r--sys/dev/kbdmux/kbdmux.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/sys/dev/kbdmux/kbdmux.c b/sys/dev/kbdmux/kbdmux.c
index f5dca8d..7fb6708 100644
--- a/sys/dev/kbdmux/kbdmux.c
+++ b/sys/dev/kbdmux/kbdmux.c
@@ -657,6 +657,27 @@ next_code:
/* see if there is something in the keyboard queue */
scancode = getc(&state->ks_inq);
if (scancode == -1) {
+ if (state->ks_flags & POLLING) {
+ kbdmux_kbd_t *k;
+
+ SLIST_FOREACH(k, &state->ks_kbds, next) {
+ while (KBDMUX_CHECK_CHAR(k->kbd)) {
+ scancode = KBDMUX_READ_CHAR(k->kbd, 0);
+ if (scancode == NOKEY)
+ break;
+ if (scancode == ERRKEY)
+ continue;
+ if (!KBD_IS_BUSY(k->kbd))
+ continue;
+
+ putc(scancode, &state->ks_inq);
+ }
+ }
+
+ if (state->ks_inq.c_cc > 0)
+ goto next_code;
+ }
+
KBDMUX_UNLOCK(state);
return (NOKEY);
}
OpenPOWER on IntegriCloud