Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Feb 2006 12:36:49 -0800
From:      Maksim Yevmenkin <maksim.yevmenkin@savvis.net>
To:        freebsd-current@freebsd.org
Subject:   [PATCH] HEADSUP: kbdmux(4)/syscons(4) patch is about to hit the tree
Message-ID:  <4404B461.8000104@savvis.net>

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

Dear Hackers,

i'm about to commit the attached patch to -current. if you have any 
objections please speak up now. the patch can also be found at

http://people.freebsd.org/~emax/kbdmux-current.diff.txt

(freefall:~emax/kbdmux-current.diff.txt)

thanks,
max

--------------010707090002070904080507
Content-Type: text/plain;
 name="kbdmux-current.diff.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="kbdmux-current.diff.txt"

Index: sys/dev/kbd/kbd.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/kbd/kbd.c,v
retrieving revision 1.44
diff -u -r1.44 kbd.c
--- sys/dev/kbd/kbd.c	13 Jul 2005 23:58:57 -0000	1.44
+++ sys/dev/kbd/kbd.c	28 Feb 2006 19:02:43 -0000
@@ -185,8 +185,12 @@
 {
 	const keyboard_driver_t **list;
 	const keyboard_driver_t *p;
+	keyboard_t *mux;
+	keyboard_info_t ki;
 	int index;
 
+	mux = kbd_get_keyboard(kbd_find_keyboard("kbdmux", -1));
+
 	for (index = 0; index < keyboards; ++index) {
 		if (keyboard[index] == NULL)
 			break;
@@ -208,6 +212,16 @@
 		if (strcmp(p->name, kbd->kb_name) == 0) {
 			keyboard[index] = kbd;
 			kbdsw[index] = p->kbdsw;
+
+			if (mux != NULL) {
+				bzero(&ki, sizeof(ki));
+				strcpy(ki.kb_name, kbd->kb_name);
+				ki.kb_unit = kbd->kb_unit;
+
+				(*kbdsw[mux->kb_index]->ioctl)
+					(mux, KBADDKBD, (caddr_t) &ki);
+			}
+
 			return (index);
 		}
 	}
@@ -216,6 +230,16 @@
 		if (strcmp(p->name, kbd->kb_name) == 0) {
 			keyboard[index] = kbd;
 			kbdsw[index] = p->kbdsw;
+
+			if (mux != NULL) {
+				bzero(&ki, sizeof(ki));
+				strcpy(ki.kb_name, kbd->kb_name);
+				ki.kb_unit = kbd->kb_unit;
+
+				(*kbdsw[mux->kb_index]->ioctl)
+					(mux, KBADDKBD, (caddr_t) &ki);
+			}
+
 			return (index);
 		}
 	}
Index: sys/dev/syscons/syscons.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/syscons/syscons.c,v
retrieving revision 1.441
diff -u -r1.441 syscons.c
--- sys/dev/syscons/syscons.c	14 Jan 2006 17:57:16 -0000	1.441
+++ sys/dev/syscons/syscons.c	28 Feb 2006 19:02:44 -0000
@@ -165,6 +165,7 @@
 static	int		debugger;
 
 /* prototypes */
+static int sc_allocate_keyboard(sc_softc_t *sc, int unit);
 static struct tty *sc_alloc_tty(struct cdev *dev);
 static int scvidprobe(int unit, int flags, int cons);
 static int sckbdprobe(int unit, int flags, int cons);
@@ -1676,8 +1677,7 @@
     if ((sc->kbd == NULL) && (sc->config & SC_AUTODETECT_KBD)) {
 	/* try to allocate a keyboard automatically */
 	if (++kbd_interval >= 25) {
-	    sc->keyboard = kbd_allocate("*", -1, (void *)&sc->keyboard,
-					sckbdevent, sc);
+	    sc->keyboard = sc_allocate_keyboard(sc, -1);
 	    if (sc->keyboard >= 0) {
 		sc->kbd = kbd_get_keyboard(sc->keyboard);
 		kbd_ioctl(sc->kbd, KDSKBMODE,
@@ -2663,9 +2663,10 @@
     sc->adapter = vid_allocate("*", unit, (void *)&sc->adapter);
     sc->adp = vid_get_adapter(sc->adapter);
     /* assert((sc->adapter >= 0) && (sc->adp != NULL)) */
-    sc->keyboard = kbd_allocate("*", unit, (void *)&sc->keyboard,
-				sckbdevent, sc);
+
+    sc->keyboard = sc_allocate_keyboard(sc, unit);
     DPRINTF(1, ("sc%d: keyboard %d\n", unit, sc->keyboard));
+
     sc->kbd = kbd_get_keyboard(sc->keyboard);
     if (sc->kbd != NULL) {
 	DPRINTF(1, ("sc%d: kbd index:%d, unit:%d, flags:0x%x\n",
@@ -3610,3 +3611,40 @@
 		return (&main_console);
 	return (SC_STAT(devptr));
 }
+
+/*
+ * Allocate active keyboard. Try to allocate "kbdmux" keyboard first, and,
+ * if found, add all non-busy keyboards to "kbdmux". Otherwise look for
+ * any keyboard.
+ */
+
+static int
+sc_allocate_keyboard(sc_softc_t *sc, int unit)
+{
+	int		 idx0, idx;
+	keyboard_t	*k0, *k;
+	keyboard_info_t	 ki;
+
+	idx0 = kbd_allocate("kbdmux", -1, (void *)&sc->keyboard, sckbdevent, sc);
+	if (idx0 != -1) {
+		k0 = kbd_get_keyboard(idx0);
+
+		for (idx = kbd_find_keyboard2("*", -1, 0);
+		     idx != -1;
+		     idx = kbd_find_keyboard2("*", -1, idx + 1)) {
+			k = kbd_get_keyboard(idx);
+
+			if (idx == idx0 || KBD_IS_BUSY(k))
+				continue;
+
+			bzero(&ki, sizeof(ki));
+			strcpy(ki.kb_name, k->kb_name);
+			ki.kb_unit = k->kb_unit;
+
+			kbd_ioctl(k0, KBADDKBD, (caddr_t) &ki);
+		}
+	} else
+		idx0 = kbd_allocate("*", unit, (void *)&sc->keyboard, sckbdevent, sc);
+
+	return (idx0);
+}

--------------010707090002070904080507--



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