From owner-FreeBSD-users-jp@jp.freebsd.org  Wed Jan 29 21:46:19 1997
Received: by jaz.jp.freebsd.org (8.8.5+2.7Wbeta4/8.7.3) id VAA26995
	Wed, 29 Jan 1997 21:46:19 +0900 (JST)
Received: by jaz.jp.freebsd.org (8.8.5+2.7Wbeta4/8.7.3) with ESMTP id VAA26990
	for <FreeBSD-users-jp@jp.freebsd.org>; Wed, 29 Jan 1997 21:46:17 +0900 (JST)
Received: from localhost (localhost [127.0.0.1]) by pochi.aa.cs.keio.ac.jp (8.8.4+2.7Wbeta4/3.5Wpl2) with ESMTP id VAA15801 for <FreeBSD-users-jp@jp.freebsd.org>; Wed, 29 Jan 1997 21:44:58 +0900 (JST)
Message-Id: <199701291244.VAA15801@pochi.aa.cs.keio.ac.jp>
To: FreeBSD-users-jp@jp.freebsd.org
In-Reply-To: Your message of "Wed, 29 Jan 1997 21:30:25 +0900"
References: <199701291230.VAA02036@hagipc.baynetworks.co.jp>
X-Mailer: Mew version 1.54 on Emacs 19.28.4, Mule 2.3
Mime-Version: 1.0
Content-Type: Multipart/Mixed;
	boundary="--Next_Part(Wed_Jan_29_21:44:55_1997)--"
Content-Transfer-Encoding: 7bit
Date: Wed, 29 Jan 1997 21:44:57 +0900
From: Keisuke Inoue / =?ISO-2022-JP?B?GyRCMGY+ZTdJMnAbKEI=?= <keisuke@aa.cs.keio.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 9236
Subject: [FreeBSD-users-jp 9236] Re: psm0 on 2.2-BETA
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org

----Next_Part(Wed_Jan_29_21:44:55_1997)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

  Atsushi Hagiwara <hagidon@hagipc.baynetworks.co.jp>
$B!?!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1(B
> $B:#!"<j;}$A$N(BDHU2$B$K(B2.2-BETA$B$rF~$l$k$Y$/!"%V!<%H%U%m%C%T!<$r(B
> $B:n@.$7$F:n6HCf$J$N$G$9$,!"$I$&$7$F$b0J2<$N%a%C%;!<%8$,(Bpsm0
> $B$r%$%M!<%V%k$K$7$?:]!"=P$F$7$^$$$^$9!#(B

> 	psm0: failed to restore keyboard controller command
> 	psm0: unable to set the command byte

> $B$3$N%a%C%;!<%8$,=P$F$b!"%V!<%H$O=*N;$9$k$N$G$9$,!"$4A[A|$N(B
> $BDL$j!"%a%K%e!<$,=P$?8e$N%-!<F~NO$O<u$1IU$1$i$l$^$;$s!#$H$j(B
> $B$"$($:(Bpsm0$B$r?($i$:$K$*$1$P!"%$%s%9%H!<%k$r40N;$G$-$k$N$G$9(B
> $B$,!"$3$N$^$^$G$O4N?4$N(BXF86$B$,%3%s%U%#%0$G$-$^$;$s!#$+$H8@$C(B
> $B$F(Bpsm0$B$r%$%M!<%V%k$K$9$k$H%-!<$,F~$i$J$$$7!D(B

$B$H$j$"$($:(Bpsm0$B$r(Bdisable$B$K$7$?$^$^%$%s%9%H!<%k$r$7!"IUB0$N%Q%C(B
$B%A(B(*1)$B$r$"$F$F(Bkernel$B$r:n@.$7$F$/$@$5$$!#(B

*1 $B2#ED!w1'ET5\$5$s(B $B$,:n@.$$$?$7$^$7$?!#(B
   $BE>:\5v2D$b$$$?$@$$$F$$$^$9!#(B
	  $B!2!2!2!2!2!2!2!2!2!2!2!2!2!2(B  $B!2!2(B
	  $B!@(B $B0f>e(B $B7I2p!w7DXf(B($BLp>e(B)    $B!@!@!?(B
	$B!?!@!@(B keisuke@aa.cs.keio.ac.jp $B!@(B
	$B!1!1(B  $B!1!1!1!1!1!1!1!1!1!1!1!1!1!1(B

----Next_Part(Wed_Jan_29_21:44:55_1997)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

--- psm.c-dist	Mon Dec  2 06:37:16 1996
+++ psm.c	Mon Jan 13 08:13:25 1997
@@ -435,6 +435,8 @@
     int i;
 
     switch((i = test_aux_port(port))) {
+    case 1:	/* ignore this error */
+	/* fall though */
     case 0:	/* no error */
     	break;
     case -1: 	/* time out */
@@ -478,10 +480,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 +514,8 @@
     if (unit >= NPSM)
         return (0);
 
+    psm_softc[unit] = NULL; 
+
     sc =  malloc(sizeof *sc, M_DEVBUF, M_NOWAIT);
 
     bzero(sc, sizeof *sc);
@@ -556,6 +564,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 +613,15 @@
      * 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 */
+	/* fall though */
     case 0:        /* no error */
         break;
     case -1:        /* time out */
@@ -705,10 +721,18 @@
     set_mouse_mode(ioport);    /* stream mode */
 
     /* 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 +769,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;
@@ -779,6 +806,7 @@
     int ioport;
     struct psm_softc *sc;
     int stat[3];
+    int ret;
 
     /* Validate unit number */
     if (unit >= NPSM)
@@ -786,7 +814,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 +877,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\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 +909,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 +939,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\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; 


----Next_Part(Wed_Jan_29_21:44:55_1997)----
