Subject: Re: kern/37569: Hangs on kernel entry due to pckbc
To: None <gnats-bugs@NetBSD.org>
From: Manuel Bouyer <bouyer@antioche.eu.org>
List: netbsd-bugs
Date: 12/19/2007 20:31:33
On Wed, Dec 19, 2007 at 06:00:00PM +0000, sborrill@precedence.co.uk wrote:
> >Number: 37569
> >Category: kern
> >Synopsis: On a machine with USB keyboard only, the kernel hangs on entry for a considerable time
> >Confidential: no
> >Severity: serious
> >Priority: medium
> >Responsible: kern-bug-people
> >State: open
> >Class: sw-bug
> >Submitter-Id: net
> >Arrival-Date: Wed Dec 19 18:00:00 +0000 2007
> >Originator: Stephen Borrill
> >Release: NetBSD 4.99.42
> >Organization:
> >Environment:
>
>
> System: NetBSD 4.99.42 (GENERIC) #4: Tue Dec 18 14:36:45 GMT 2007
> Architecture: i386
> Machine: i386
> >Description:
> On an HP ML110 boot a GENERIC kernel. There is a very long pause (5 mins?) before
> any kernel text is printed, a similar pause after pckbd0 as isa0 is probed and also when
> shutting down.
>
> The ML110 is odd in that it appears to have PS/2 ports, but in fact these are connected
> to an internal PS/2 to USB convertor:
>
> uhidev0 at uhub3 port 1 configuration 1 interface 0
> uhidev0: ServerEngines SE USB Device, rev 1.10/0.01, addr 2, iclass 3/1
> ukbd0 at uhidev0
> wskbd1 at ukbd0 mux 1
> wskbd1: connecting to wsdisplay0
> uhidev1 at uhub3 port 1 configuration 1 interface 1
> uhidev1: ServerEngines SE USB Device, rev 1.10/0.01, addr 2, iclass 3/1
> ums0 at uhidev1: 8 buttons and Z dir.
> wsmouse0 at ums0 mux 0
> >How-To-Repeat:
> Boot GENERIC i386 or amd64 on a HP ML110.
> >Fix:
> Options:
> 1) put "no pckbd" in your kernel config
> 2) Set a shorter timeout in dev/ic/pckbc.c
>
> --- sys/dev/ic/pckbc.c.orig 2007-12-19 17:56:16.000000000 +0000
> +++ sys/dev/ic/pckbc.c 2007-12-19 17:57:40.000000000 +0000
> @@ -134,6 +134,11 @@
> * in some system configurations.
> * This is not canonical way to handle polling input.
> */
> +
> +#ifndef PCKBC_POLLTIME
> +#define PCKBC_POLLTIME 100
> +#endif
> +
> int
> pckbc_poll_data1(pt, slot)
> void *pt;
> @@ -143,7 +148,7 @@
> struct pckbc_slotdata *q = t->t_slotdata[slot];
> int s;
> u_char stat, c;
> - int i = 100000; /* if 1 port read takes 1us (?), this polls for 100ms */
> + int i = PCKBC_POLLTIME;
> int checkaux = t->t_haveaux;
>
> s = splhigh();
Won't this cause problem on other hardware ? It may be better to use delay()
here, if it's possible at this time.
--
Manuel Bouyer <bouyer@antioche.eu.org>
NetBSD: 26 ans d'experience feront toujours la difference
--