From jbrann@freebie.brann.org  Mon Jan 20 11:34:14 1997
Received: from freebie.brann.org ([207.122.63.57])
          by freefall.freebsd.org (8.8.4/8.8.4) with ESMTP id LAA20577
          for <FreeBSD-gnats-submit@freebsd.org>; Mon, 20 Jan 1997 11:34:10 -0800 (PST)
Received: (from jbrann@localhost) by freebie.brann.org (8.8.2/8.8.2) id OAA23915; Mon, 20 Jan 1997 14:34:04 -0500 (EST)
Message-Id: <199701201934.OAA23915@freebie.brann.org>
Date: Mon, 20 Jan 1997 14:34:04 -0500 (EST)
From: John Brann <jbrann@freebie.brann.org>
Reply-To: jbrann@freebie.brann.org
To: FreeBSD-gnats-submit@freebsd.org
Subject: keyboard lock with Toshiba laptop
X-Send-Pr-Version: 3.2

>Number:         2539
>Category:       bin
>Synopsis:       keyboard lock with Toshiba laptop
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:
>Keywords:
>Date-Required:
>Class:          support
>Submitter-Id:   current-users
>Arrival-Date:   Mon Jan 20 11:40:02 PST 1997
>Closed-Date:    Mon Feb 10 16:04:15 PST 1997
>Last-Modified:  Mon Feb 10 16:08:50 PST 1997
>Originator:     John Brann
>Release:        FreeBSD 2.2-BETA i386
>Organization:
Not while I'm at home
>Environment:

Toshiba 415CS laptop, FreeBSD 2.2-BETA.

>Description:

Enabling the builtin PS/2 mouse causes keyboard hang.  This is observable
with the install kernel, the GENERIC kernel and a purpose-built kernel.

Disabling the psm0 device causes the machine to behave normally.

The mouse works correctly with 2.1.6 and 2.2-960612-SNAP


>How-To-Repeat:

Use runtime configuration of install kernel to enable psm0 device.
Disabling unused devices has no effect.

Use runtime configuration of GENERIC kernel to enable psm0 device.
Disabling unused devices has no effect.

Build and boot kernel for machine, removing all extraneous devices.

>Fix:
	
Unknown
>Release-Note:
>Audit-Trail:

From: Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
To: jbrann@freebie.brann.org
Cc: FreeBSD-gnats-submit@freebsd.org, yokota@zodiac.mech.utsunomiya-u.ac.jp
Subject: Re: bin/2539: keyboard lock with Toshiba laptop 
Date: Tue, 21 Jan 1997 09:12:18 +0900

 >>Number:         2539
 >>Category:       bin
 >>Synopsis:       keyboard lock with Toshiba laptop
 >>Confidential:   no
 >>Severity:       serious
 >>Priority:       high
 >>Responsible:    freebsd-bugs
 >>State:          open
 >>Class:          support
 >>Submitter-Id:   current-users
 >>Arrival-Date:   Mon Jan 20 11:40:02 PST 1997
 >>Last-Modified:
 >>Originator:     John Brann
 >>Organization:
 >Not while I'm at home
 >>Release:        FreeBSD 2.2-BETA i386
 >>Environment:
 >
 >Toshiba 415CS laptop, FreeBSD 2.2-BETA.
 >
 >>Description:
 >
 >Enabling the builtin PS/2 mouse causes keyboard hang.  This is observable
 >with the install kernel, the GENERIC kernel and a purpose-built kernel.
 >
 >Disabling the psm0 device causes the machine to behave normally.
 
 The `psm' driver in 2.2-BETA is very new, and several problems have
 been reported and corrected so far.
 
 Would you possibly check the following?
 
 1. Any error messages logged during the boot process. The lines
    you should look for are marked with either "sc0:...", "psm:...", or
    "kbdio:...".
 2. If you can bother, put 
        options "PSM_DEBUG=2"
        options "KBDIO_DEBUG=2"
    in your kernel configuration file, rebuild the kernel and reboot. 
    You should see a lot more messages this time.
 3. Please don't use `moused' for now. The `psm' driver and `moused' in
    2.2-BETA just don't work together (this problem has been correced
    for the next release.)
 
 >The mouse works correctly with 2.1.6 and 2.2-960612-SNAP
 
 Hmmm. 
 
 Kazu.

From: Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
To: jbrann@freebie.brann.org
Cc: FreeBSD-gnats-submit@freebsd.org, yokota@zodiac.mech.utsunomiya-u.ac.jp
Subject: Re: bin/2539: keyboard lock with Toshiba laptop 
Date: Wed, 29 Jan 1997 23:23:30 +0900

 >>>Number:         2539
 >>>Category:       bin
 >>>Synopsis:       keyboard lock with Toshiba laptop
 >>>Confidential:   no
 >>>Severity:       serious
 >>>Priority:       high
 
 >The `psm' driver in 2.2-BETA is very new, and several problems have
 >been reported and corrected so far.
 >
 >Would you possibly check the following?
 >
 >1. Any error messages logged during the boot process. The lines
 >   you should look for are marked with either "sc0:...", "psm:...", or
 >   "kbdio:...".
 >2. If you can bother, put 
 >       options "PSM_DEBUG=2"
 >       options "KBDIO_DEBUG=2"
 >   in your kernel configuration file, rebuild the kernel and reboot. 
 >   You should see a lot more messages this time.
 >3. Please don't use `moused' for now. The `psm' driver and `moused' in
 >   2.2-BETA just don't work together (this problem has been correced
 >   for the next release.)
 >
 >>The mouse works correctly with 2.1.6 and 2.2-960612-SNAP
 >
 >Hmmm. 
 >
 >Kazu.
 
 Since you reported the problem, I haven't heard from you. I, as the
 programmer of the psm driver, am rather concerned that you may have
 abandoned to use the PS/2 mouse device all together.
 
 Several problems with the psm driver in 2.2-BETA have been reported by
 other people as well, and a fix has been issued. Please find patch at
 the end of this mail. I would be very grateful if you could try this
 patch and see if it works for you. The patch will modify psm.c,
 kbdio.c, and kbdio.h in /usr/src/sys/i386/isa.
 
 Thank you, in advance, for your cooperation.
 
 Kazu
 
 ===================================================================
 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
 

From: Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
To: John Brann <jbrann@brann.org>
Cc: FreeBSD-gnats-submit@freebsd.org, yokota@zodiac.mech.utsunomiya-u.ac.jp
Subject: Re: bin/2539: keyboard lock with Toshiba laptop 
Date: Sun, 09 Feb 1997 12:01:21 +0900

 >The patch works, so you can close the pr.  If it's of any interest, I
 >am attaching the relevant boot messages...
 
 That's a great news!! I am very relieved. Thank you very much for 
 your cooperation.
 
 >Boot output (only keyboard and mouse messages)...
 >
 >Feb  8 15:54:54 jbtosh /kernel22: Probing for devices on the ISA bus:
 >Feb  8 15:54:54 jbtosh /kernel22: kbdio: RESET_KBD return code:00fa
 >Feb  8 15:54:54 jbtosh /kernel22: kbdio: RESET_KBD status:00aa
 >......
 
 May I ask you one last favor? Would you compile the kernel without
 "options KBDIO_DEBUG", "options PSM_DEBUG", and "options PSM_NO_RESET", 
 and verify that the patch still works? In a rare case, some systems 
 behave in different ways, with and without these options.
 
 Kazu
State-Changed-From-To: open->closed 
State-Changed-By: yokota 
State-Changed-When: Mon Feb 10 16:04:15 PST 1997 
State-Changed-Why:  
The PR originator verified that the patch fixed the problem. 
>Unformatted:
