Subject: kern/37569: Hangs on kernel entry due to pckbc
To: None <kern-bug-people@netbsd.org, gnats-admin@netbsd.org,>
From: None <sborrill@precedence.co.uk>
List: netbsd-bugs
Date: 12/19/2007 18:00:00
>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();

>Unformatted: