On 08/30/13 11:35, Lundberg, Johannes wrote:
Hi Hans

I tried the patch and the result is the same. However, I found the command
that causes the freeze. Also, it is not always it freezes but maybe 9/10
reboots or more frequently.

At the end of the function xhci_start_controller(..) there is a for loop:

487        for (i = 0; i != 100; i++) {
488                usb_pause_mtx(NULL, hz / 100);
489                temp = XREAD4(sc, oper, XHCI_USBSTS) & XHCI_STS_HCH;
490                if (!temp)
491                        break;
492        }

and it freezes at usb_pause_mtx(...)
value of i is 0
value of hz is 1000

Hi,

Can you try the attached patch?

I think this is a problem inside DELAY(). Maybe you have to select another timing source for DELAY(), mav @ CC'ed?

--HPS

=== sys/kern/kern_synch.c
==================================================================
--- sys/kern/kern_synch.c	(revision 254832)
+++ sys/kern/kern_synch.c	(local)
@@ -356,11 +356,8 @@
 int
 pause_sbt(const char *wmesg, sbintime_t sbt, sbintime_t pr, int flags)
 {
-	int sbt_sec;
+	KASSERT(sbt >= 0, ("pause: timeout must be >= 0"));
 
-	sbt_sec = sbintime_getsec(sbt);
-	KASSERT(sbt_sec >= 0, ("pause: timo must be >= 0"));
-
 	/* silently convert invalid timeouts */
 	if (sbt == 0)
 		sbt = tick_sbt;
@@ -370,11 +367,14 @@
 		 * We delay one second at a time to avoid overflowing the
 		 * system specific DELAY() function(s):
 		 */
-		while (sbt_sec > 0) {
+		while (sbt >= SBT_1S) {
 			DELAY(1000000);
-			sbt_sec--;
+			sbt -= SBT_1S;
 		}
-		DELAY((sbt & 0xffffffff) / SBT_1US);
+		/* Do the delay remainder */
+		sbt /= SBT_1US;
+		if (sbt != 0)
+			DELAY(sbt);
 		return (0);
 	}
 	return (_sleep(&pause_wchan[curcpu], NULL, 0, wmesg, sbt, pr, flags));
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to