[ prevent ehci_takecontroller from looping at infinite ]

lementec fabien fabien.lementec at gmail.com
Mon Jan 12 10:05:26 PST 2009


Hi,

On an Acer Aspire 5500, freebsd is hanging in
usb/ehci_pci in the ehci_takecontroller function.
The device pci conf space reads invalid values
0xffffffff, making the function looping at infinite,
thus never entering ehci_init.

I dont know if the problem does not come from
earlier, but I did the following patch:

--- orig/sys/dev/usb/ehci_pci.c	2009-01-11 06:14:12.000000000 +0100
+++ new/sys/dev/usb/ehci_pci.c	2009-01-11 06:15:14.000000000 +0100
@@ -549,6 +549,10 @@

 	cparams = EREAD4(sc, EHCI_HCCPARAMS);

+	/* prevent from looping ad infinite. ehci_init will fail. */
+	if (cparams == 0xffffffff)
+	  return ;
+
 	/* Synchronise with the BIOS if it owns the controller. */
 	for (eecp = EHCI_HCC_EECP(cparams); eecp != 0;
 	    eecp = EHCI_EECP_NEXT(eec)) {
@@ -584,6 +588,9 @@
 	int eecp;

 	cparams = EREAD4(sc, EHCI_HCCPARAMS);
+	if (cparams == 0xffffffff)
+	  return ;
+
 	for (eecp = EHCI_HCC_EECP(cparams); eecp >= 0x40;
 	    eecp = EHCI_EECP_NEXT(eec)) {
 		eec = pci_read_config(self, eecp, 4);

I hop it helps,

Fabien.


-- 
"What I cannot create I dont understand"


More information about the freebsd-usb mailing list