Date: Tue, 25 Jul 2006 14:58:46 -0700 From: Maksim Yevmenkin <maksim.yevmenkin@savvis.net> To: freebsd-current@freebsd.org Cc: brien@freebsd.org Subject: Re: PS/2 keyboard support in mid-boot borked [PATCH] Message-ID: <44C69416.4090104@savvis.net> In-Reply-To: <44B4015D.8050105@savvis.net> References: <20060710212815.GA46336@dragon.NUXI.org> <200607102027.18106.jhb@freebsd.org> <20060711181600.GB64759@dragon.NUXI.org> <44B3ECFC.1050806@savvis.net> <44B3F154.7030001@centtech.com> <44B4015D.8050105@savvis.net>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
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
[-- Attachment #2 --]
--- kbdmux.c.orig Tue Jul 25 14:50:22 2006
+++ kbdmux.c Tue Jul 25 14:41:47 2006
@@ -657,6 +657,27 @@
/* 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);
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?44C69416.4090104>
