hackers, [...] >>> like i said before, i think, the problem is that atkbd(4) does not >>> deal with "polled" mode properly. kbdmux(4) never sees input from >>> atkbd(4) because (imo) atkbd(4) interrupt handler is never called. >>> the atkbd(4) patch i posted awhile ago has a regression, i.e. >>> atkbd(4) produces duplicate characters in ddb(4), midboot, etc. >>> *without* kbdmux(4). patched atkbd(4) with kbdmux(4) works fine. >>> >>> i'm actually a bit puzzled why atkbd(4) works without kbdmux(4) in >>> ddb(4), midboot,e etc. obviously i need to spend some quality time >>> with the debugger :) i hope to get to it, eventually :) sorry for the >>> delay. >> >> What can we do to help you debug it? I know for me, it's a major >> pain, and I'm sure others have gotten jammed up too. > > i just spent half of my lunch hour with the debugger :) and, i think, i > know what is going on here. i think, there is some twisted interaction > going on in > > sccngetch(int flags) > { > ... > kbd_poll(scp->sc->kbd, TRUE); > c = scgetc(scp->sc, SCGETC_CN | flags); > kbd_poll(scp->sc->kbd, FALSE); > ... > } > > and > > sckbdevent() > { > ... > while ((c = scgetc(sc, SCGETC_NONBLOCK)) != NOKEY) { > ... > } > > code that causes duplicated input in atkbd(4) without kbdmux(4). so, my > original patch was not 100% correct. i will try to redo it to see if i > can work around the problem. if you have problems with kbdmux(4) and atkbd(4) NOT working mid-boot, could you please try the attached patch. i decided to add a little hack to kbdmux(4) instead of messing around with atkbd(4). please let me know if it works for you. thanks, max --- kbdmux.c.orig Tue Jul 25 14:50:22 2006 +++ kbdmux.c Tue Jul 25 14:41:47 2006 _at__at_ -657,6 +657,27 _at__at_ /* 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); }Received on Tue Jul 25 2006 - 19:58:58 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:58 UTC