Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Apr 2006 16:43:28 -0700
From:      Maksim Yevmenkin <maksim.yevmenkin@savvis.net>
To:        freebsd-current@freebsd.org
Subject:   [PATCH] kbdmux(4), atkbd(4) and ddb(4)
Message-ID:  <44515720.8020908@savvis.net>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------040001030303040502090306
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

dear hackers,

there were many complains about atkbd(4) not working in ddb(4) with 
kbdmux(4) enabled.

i had a minute of free time and looked into this. it seems to me that 
atkbd(4) is not dealing properly with "polled" mode. after looking at 
the code, i came up with the attached patch.

i did some very brief testing and the patch works for me. atkbd(4) now 
works in ddb(4) and single user mode with kbdmux(4) enabled.

the patch is rather ugly (imo), because it assumes that something will 
call "poll" method repeatedly (which seems like we do it). also, ukbd(4) 
has somewhat similar code.

could someone (with atkbd(4), syscons(4) and ddb(4) fu) please review it 
and tell me if its ok to commit.

also, i would appreciate if someone would perform more extensive testing 
to see if there are any regressions.

thanks,
max

--------------040001030303040502090306
Content-Type: text/plain;
 name="atkbd.c.diff.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="atkbd.c.diff.txt"

--- atkbd.c.orig	Thu Apr 27 16:29:26 2006
+++ atkbd.c	Thu Apr 27 16:30:13 2006
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/dev/atkbdc/atkbd.c,v 1.47 2005/06/10 20:56:37 marius Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/atkbdc/atkbd.c,v 1.47 2005/06/10 20:56:37 marius Exp $");
 
 #include "opt_kbd.h"
 #include "opt_atkbd.h"
@@ -1023,6 +1023,15 @@
 		++state->ks_polling;
 	else
 		--state->ks_polling;
+
+	if (state->ks_polling) {
+		if ((*kbdsw[kbd->kb_index]->lock)(kbd, TRUE)) {
+			(*kbdsw[kbd->kb_index]->lock)(kbd, FALSE);
+			if ((*kbdsw[kbd->kb_index]->check_char)(kbd))
+				(*kbdsw[kbd->kb_index]->intr)(kbd, NULL);
+		}
+	}
+
 	splx(s);
 	return 0;
 }

--------------040001030303040502090306--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?44515720.8020908>