Re: PS/2 keyboard support in mid-boot borked [PATCH]

From: Maksim Yevmenkin <maksim.yevmenkin_at_savvis.net>
Date: Tue, 25 Jul 2006 14:58:46 -0700
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