From owner-FreeBSD-users-jp@jp.freebsd.org  Wed Jan 29 22:26:48 1997
Received: by jaz.jp.freebsd.org (8.8.5+2.7Wbeta4/8.7.3) id WAA27307
	Wed, 29 Jan 1997 22:26:48 +0900 (JST)
Received: by jaz.jp.freebsd.org (8.8.5+2.7Wbeta4/8.7.3) with ESMTP id WAA27301
	for <freebsd-users-jp@jp.freebsd.org>; Wed, 29 Jan 1997 22:26:47 +0900 (JST)
Received: from outmail.utsunomiya-u.ac.jp by nasu.utsunomiya-u.ac.jp; (8.8.4+2.7Wbeta4/1.1.8.2/21Jan97-0917PM)
	id WAA17374; Wed, 29 Jan 1997 22:26:46 +0900 (JST)
Received: from zodiac.mech.utsunomiya-u.ac.jp by outmail.utsunomiya-u.ac.jp; (8.8.4+2.7Wbeta4/1.1.8.2/21Jan97-0900PM)
	id WAA19776; Wed, 29 Jan 1997 22:26:45 +0900 (JST)
Received: from zodiac.mech.utsunomiya-u.ac.jp (zenith.mech.utsunomiya-u.ac.jp [160.12.33.60]) by zodiac.mech.utsunomiya-u.ac.jp (8.7.6+2.6Wbeta7/3.4W/zodiac-May96) with ESMTP
	id WAA02769; Wed, 29 Jan 1997 22:30:29 +0900 (JST)
Message-Id: <199701291330.WAA02769@zodiac.mech.utsunomiya-u.ac.jp>
To: FreeBSD-users-jp@jp.freebsd.org
cc: yokota@zodiac.mech.utsunomiya-u.ac.jp
In-reply-to: Your message of "Wed, 29 Jan 1997 21:30:25 JST."
             <199701291230.VAA02036@hagipc.baynetworks.co.jp> 
References: <199701291230.VAA02036@hagipc.baynetworks.co.jp> 
Date: Wed, 29 Jan 1997 22:30:26 +0900
From: Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
Reply-To: FreeBSD-users-jp@jp.freebsd.org
Precedence: bulk
X-Distribute: distribute [version 2.1 (Alpha) patchlevel=19]
X-Sequence: FreeBSD-users-jp 9240
Subject: [FreeBSD-users-jp 9240] Re: psm0 on 2.2-BETA 
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org

$@2#ED!w1'ET5\$G$9!#(J

>$@$O$.$o$i$G$9!#$3$s$P$s$o!#(J
>
>$@:#!"<j;}$A$N(JDHU2$@$K(J2.2-BETA$@$rF~$l$k$Y$/!"%V!<%H%U%m%C%T!<$r:n@.$7$F:n6HCf$J$N$G(J
>$@$9$,!"$I$&$7$F$b0J2<$N%a%C%;!<%8$,(Jpsm0$@$r%$%M!<%V%k$K$7$?:]!"=P$F$7$^$$$^$9!#(J
>
>	psm0: failed to restore keyboard controller command
>	psm0: unable to set the command byte
>
>$@$3$N%a%C%;!<%8$,=P$F$b!"%V!<%H$O=*N;$9$k$N$G$9$,!"$4A[A|$NDL$j!"%a%K%e!<$,=P$?(J
>$@8e$N%-!<F~NO$O<u$1IU$1$i$l$^$;$s!#$H$j$"$($:(Jpsm0$@$r?($i$:$K$*$1$P!"%$%s%9%H!<%k(J
>$@$r40N;$G$-$k$N$G$9$,!"$3$N$^$^$G$O4N?4$N(JXF86$@$,%3%s%U%#%0$G$-$^$;$s!#$+$H8@$C$F(J
>psm0$@$r%$%M!<%V%k$K$9$k$H%-!<$,F~$i$J$$$7!D(J
>
>$@%V!<%H$K;HMQ$7$?(Jboot.flp$@$O!"(JIIJ$@!"(JTokyoNet$@!"(JNIS$@$HK\2H$N(Jftp site$@$NJ*$r;n$7$F$$$^(J
>$@$9$,!"$I$l$b$*$J$8$3$H$G$7$?!#(J
>
>$@$I$J$?$+!"$*?4$"$?$j!"$"$k$$$O2sHr:vEy!"$4B8CN$"$j$^$;$s$+!#(J
>
>$@8=:_(J2.1.6R$@$G1?MQ$7$F$$$^$9!#$b$A$m$s(Jpsm0$@$O$D$+$($F$$$^$9!#(J
>
>$@$O$.$I$s(J

2.2-BETA $@$N(J psm $@%I%i%$%P$K4X$7$F$O!$$$$/$D$+LdBj$,H/8+$5$l(J fix $@$,$G$^(J
$@$7$?!#$3$N%a%$%k$N8e$m$K%Q%C%A$r$D$1$^$9$N$G!$$H$j$"$($:(Jpsm0 $@$r%G%#%9(J
$@%(!<%V%k$7$F%$%s%9%H!<%k$r9T$J$$!$$=$N8e(J /usr/src/sys/i386/isa$@$N(J 
psm.c, kbdio.c, kbdio.h $@$K$3$N%Q%C%A$r$"$F$F%+!<%M%k$r:n$jD>$7$F$$$?$@(J
$@$1$^$9$+!#$=$l$G$b$^$@$@$a$J$h$&$G$7$?$i8fO"Mm2<$5$$!#(J

$@$J$*!$(Jmoused $@$r$*;H$$$K$J$k>l9g$K$O(J moused.c $@$K$bJLES%Q%C%A$,I,MW$K$J(J
$@$j$^$9!#(J

-----------------------------------------------------------------
$@2#EDOBN4(J
$@")(J321 $@FJLZ8)1'ET5\;T@P0fD.(J2753 $@1'ET5\Bg3X9)3XIt5!3#%7%9%F%`9)3X2J(J
Tel: 028-689-6062$@!JD>DL!K(JFAX: 028-689-6009
E-mail: yokota@zodiac.mech.utsunomiya-u.ac.jp
-----------------------------------------------------------------

===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/psm.c,v
retrieving revision 1.25.2.3
retrieving revision 1.25.2.5
diff -u -r1.25.2.3 -r1.25.2.5
--- src/sys/i386/isa/psm.c	1996/12/03 10:47:24	1.25.2.3
+++ src/sys/i386/isa/psm.c	1997/01/15 12:03:33	1.25.2.5
@@ -19,7 +19,7 @@
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $Id: psm.c,v 1.25.2.3 1996/12/03 10:47:24 phk Exp $
+ * $Id: psm.c,v 1.25.2.5 1997/01/15 12:03:33 sos Exp $
  */
 
 /*
@@ -435,6 +435,11 @@
     int i;
 
     switch((i = test_aux_port(port))) {
+    case 1:	/* ignore this error */
+	if (verbose)
+	    log(LOG_DEBUG, "psm%d: strange result for test aux port (%d).\n",
+	        PSM_UNIT(dev), i);
+	/* fall though */
     case 0:	/* no error */
     	break;
     case -1: 	/* time out */
@@ -478,10 +483,14 @@
     }
 
     /* just check the status of the mouse */
+    i = get_mouse_status(port, stat);
     if (verbose) {
-        get_mouse_status(port, stat);
-        log(LOG_DEBUG, "psm%d: status %02x %02x %02x (reinitialized)\n",
-            PSM_UNIT(dev), stat[0], stat[1], stat[2]);
+	if (i)
+            log(LOG_DEBUG, "psm%d: status %02x %02x %02x\n",
+                PSM_UNIT(dev), stat[0], stat[1], stat[2]);
+	else
+	    log(LOG_DEBUG, "psm%d: failed to get mouse status\n", 
+		PSM_UNIT(dev));
     }
 
     return TRUE;
@@ -508,6 +517,8 @@
     if (unit >= NPSM)
         return (0);
 
+    psm_softc[unit] = NULL; 
+
     sc =  malloc(sizeof *sc, M_DEVBUF, M_NOWAIT);
 
     bzero(sc, sizeof *sc);
@@ -556,6 +567,7 @@
      */
 
     /* save the current command byte; it will be used later */
+    empty_both_buffers(ioport, 20);	
     if (!write_controller_command(ioport,KBDC_GET_COMMAND_BYTE)) {
         /* CONTROLLER ERROR */
         printf("psm%d: failed to get the current command byte value.\n",
@@ -604,8 +616,18 @@
      * supporsed to return with an error code or simply time out. In any
      * case, we have to continue probing the port even when the controller
      * passes this test.
+     *
+     * XXX: some controllers erroneously return the error code 1 when
+     * it has the perfectly functional aux port. We have to ignore this
+     * error code. Even if the controller HAS error with the aux port,
+     * it will be detected later...
      */
     switch ((i = test_aux_port(ioport))) {
+    case 1:	   /* ignore this error */
+        if (verbose)
+	    printf("psm%d: strange result for test aux port (%d).\n",
+	        unit, i);
+	/* fall though */
     case 0:        /* no error */
         break;
     case -1:        /* time out */
@@ -693,6 +715,7 @@
 
     /* set mouse parameters */
     /* FIXME:XXX should we set them in `psmattach()' rather than here? */
+#if 0
     if (setparams) {
         if (sc->mode.rate > 0)
             sc->mode.rate = set_mouse_sampling_rate(ioport, sc->mode.rate);
@@ -703,12 +726,25 @@
     /* FIXME:XXX I don't know if these parameters are reasonable */
     set_mouse_scaling(ioport);    /* 1:1 scaling */
     set_mouse_mode(ioport);    /* stream mode */
+#else
+    i = send_aux_command(ioport, PSMC_SET_DEFAULTS);
+    if (verbose >= 2)
+	log(LOG_DEBUG, "psm%d: SET_DEFAULTS return code:%04x\n", unit, i);
+#endif
 
     /* just check the status of the mouse */
+    /* 
+     * XXX there are some arcane controller/mouse combinations out there,
+     * which hung the controller unless there is data transmission 
+     * after ACK from the mouse.
+     */
+    i = get_mouse_status(ioport, stat);
     if (verbose) {
-        get_mouse_status(ioport, stat);
-        log(LOG_DEBUG, "psm%d: status %02x %02x %02x\n",
-            unit, stat[0], stat[1], stat[2]);
+	if (i)
+            log(LOG_DEBUG, "psm%d: status %02x %02x %02x\n",
+                unit, stat[0], stat[1], stat[2]);
+	else
+	    log(LOG_DEBUG, "psm%d: failed to get mouse status\n", unit);
     }
 
     /* disable the aux port for now... */
@@ -745,6 +781,9 @@
     int unit = dvp->id_unit;
     struct psm_softc *sc = psm_softc[unit];
 
+    if (sc == NULL)    /* shouldn't happen */ 
+	return (0); 
+
     /* initial operation mode */
     sc->mode.accelfactor = PSM_ACCEL;
     sc->mode.protocol = MOUSE_PROTO_PS2;
@@ -763,8 +802,11 @@
         DV_CHR, 0, 0, 0666, "npsm%d", unit);
 #endif
 
-    printf("psm%d: device ID %d, %d buttons?\n",
-        unit, sc->hw.hwid, sc->hw.buttons);
+    if (verbose)
+        printf("psm%d: device ID %d, %d buttons?\n",
+            unit, sc->hw.hwid, sc->hw.buttons);
+    else
+        printf("psm%d: device ID %d\n", unit, sc->hw.hwid);
 
     if (bootverbose)
         --verbose;
@@ -779,6 +821,7 @@
     int ioport;
     struct psm_softc *sc;
     int stat[3];
+    int ret;
 
     /* Validate unit number */
     if (unit >= NPSM)
@@ -786,7 +829,7 @@
 
     /* Get device data */
     sc = psm_softc[unit];
-    if ((sc->state & PSM_VALID) == 0)
+    if ((sc == NULL) || (sc->state & PSM_VALID) == 0)
 	/* the device is no longer valid/functioning */
         return (ENXIO);
     ioport = sc->addr;
@@ -849,10 +892,14 @@
         return (EIO);
     }
 
+    ret = get_mouse_status(ioport, stat);
     if (verbose >= 2) {
-        get_mouse_status(ioport, stat);
-        log(LOG_DEBUG, "psm%d: status %02x %02x %02x\n",
-            unit, stat[0], stat[1], stat[2]);
+	if (ret)
+            log(LOG_DEBUG, "psm%d: status %02x %02x %02x (psmopen)\n",
+                unit, stat[0], stat[1], stat[2]);
+	else
+	    log(LOG_DEBUG, "psm%d: failed to get mouse status (psmopen).\n",
+		unit);
     }
 
     /* enable the aux port and interrupt */
@@ -877,6 +924,8 @@
 {
     struct psm_softc *sc = psm_softc[PSM_UNIT(dev)];
     int ioport = sc->addr;
+    int stat[3];
+    int ret;
 
     /* disable the aux interrupt */
     if (!set_controller_command_byte(ioport, sc->command_byte,
@@ -905,6 +954,17 @@
 	log(LOG_ERR, "psm%d: failed to disable the device (psmclose).\n",
 	    PSM_UNIT(dev));
     }
+
+    ret = get_mouse_status(ioport, stat);
+    if (verbose >= 2) {
+	if (ret)
+            log(LOG_DEBUG, "psm%d: status %02x %02x %02x (psmclose)\n",
+                PSM_UNIT(dev), stat[0], stat[1], stat[2]);
+	else
+	    log(LOG_DEBUG, "psm%d: failed to get mouse status (psmclose).\n",
+		PSM_UNIT(dev));
+    }
+
     if (!set_controller_command_byte(ioport, sc->command_byte,
 	KBD_DISABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) {
 	/* CONTROLLER ERROR; 

===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/kbdio.c,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- src/sys/i386/isa/kbdio.c	1996/12/04 16:11:39	1.1.2.2
+++ src/sys/i386/isa/kbdio.c	1997/01/15 12:03:38	1.1.2.3
@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: kbdio.c,v 1.1.2.2 1996/12/04 16:11:39 phk Exp $
+ * $Id: kbdio.c,v 1.1.2.3 1997/01/15 12:03:38 sos Exp $
  */
 
 #include <sys/param.h>
@@ -295,64 +295,76 @@
 
 /* discard data from the keyboard */
 void
-empty_kbd_buffer(int port, int t)
+empty_kbd_buffer(int port, int wait)
 {
+    int t;
     int b;
     int c = 0;
     int delta = 2;
 
-    for (; t > 0; t -= delta) { 
+    for (t = wait; t > 0; ) { 
         if ((inb(port + KBD_STATUS_PORT) & KBDS_BUFFER_FULL)
     	   == KBDS_KBD_BUFFER_FULL) {
 	    DELAY(KBDD_DELAYTIME);
-        b = inb(port + KBD_DATA_PORT);
-        ++c;
-    }
+            b = inb(port + KBD_DATA_PORT);
+            ++c;
+	    t = wait;
+	} else {
+	    t -= delta;
+        }
         DELAY(delta*1000);
     }
     if ((verbose >= 2) && (c > 0))
-    log(LOG_DEBUG,"kbdio: %d char read (empty_kbd_buffer)\n",c);
+        log(LOG_DEBUG,"kbdio: %d char read (empty_kbd_buffer)\n",c);
 }
 
 /* discard data from the aux device */
 void
-empty_aux_buffer(int port, int t)
+empty_aux_buffer(int port, int wait)
 {
+    int t;
     int b;
     int c = 0;
     int delta = 2;
 
-    for (; t > 0; t -= delta) { 
+    for (t = wait; t > 0; ) { 
         if ((inb(port + KBD_STATUS_PORT) & KBDS_BUFFER_FULL)
     	    == KBDS_AUX_BUFFER_FULL) {
 	    DELAY(KBDD_DELAYTIME);
-        b = inb(port + KBD_DATA_PORT);
-        ++c;
-    }
+            b = inb(port + KBD_DATA_PORT);
+            ++c;
+	    t = wait;
+	} else {
+	    t -= delta;
+        }
 	DELAY(delta*1000);
     }
     if ((verbose >= 2) && (c > 0))
-    log(LOG_DEBUG,"kbdio: %d char read (empty_aux_buffer)\n",c);
+        log(LOG_DEBUG,"kbdio: %d char read (empty_aux_buffer)\n",c);
 }
 
 /* discard any data from the keyboard or the aux device */
 void
-empty_both_buffers(int port, int t)
+empty_both_buffers(int port, int wait)
 {
+    int t;
     int b;
     int c = 0;
     int delta = 2;
 
-    for (; t > 0; t -= delta) { 
+    for (t = wait; t > 0; ) { 
         if (inb(port + KBD_STATUS_PORT) & KBDS_ANY_BUFFER_FULL) {
 	    DELAY(KBDD_DELAYTIME);
-        b = inb(port + KBD_DATA_PORT);
-        ++c;
-    }
+            b = inb(port + KBD_DATA_PORT);
+            ++c;
+	    t = wait;
+	} else {
+	    t -= delta;
+        }
 	DELAY(delta*1000);
     }
     if ((verbose >= 2) && (c > 0))
-    log(LOG_DEBUG,"kbdio: %d char read (empty_both_buffers)\n",c);
+        log(LOG_DEBUG,"kbdio: %d char read (empty_both_buffers)\n",c);
 }
 
 /* keyboard and mouse device control */

===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/kbdio.h,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- src/sys/i386/isa/kbdio.h	1996/12/04 16:11:45	1.1.2.2
+++ src/sys/i386/isa/kbdio.h	1997/01/15 12:03:41	1.1.2.3
@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: kbdio.h,v 1.1.2.2 1996/12/04 16:11:45 phk Exp $
+ * $Id: kbdio.h,v 1.1.2.3 1997/01/15 12:03:41 sos Exp $
  */
 
 #ifndef _I386_ISA_KBDIO_H_
@@ -93,6 +93,7 @@
 #define PSMC_RESET_DEV	     	0x00ff
 #define PSMC_ENABLE_DEV      	0x00f4
 #define PSMC_DISABLE_DEV     	0x00f5
+#define PSMC_SET_DEFAULTS	0x00f6
 #define PSMC_SEND_DEV_ID     	0x00f2
 #define PSMC_SEND_DEV_STATUS 	0x00e9
 #define PSMC_SEND_DEV_DATA	0x00eb

