Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Dec 2016 09:28:13 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r310242 - head/sys/dev/usb
Message-ID:  <201612190928.uBJ9SDFc078376@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Mon Dec 19 09:28:12 2016
New Revision: 310242
URL: https://svnweb.freebsd.org/changeset/base/310242

Log:
  Defer USB enumeration until the SI_SUB_KICK_SCHEDULER is executed to avoid
  boot panics in conjunction with the recently added EARLY_AP_STARTUP feature.
  The panics happen due to using kernel facilities like callouts too early.
  
  Tested by:	jhb @
  MFC after:	1 week

Modified:
  head/sys/dev/usb/usb_hub.c
  head/sys/dev/usb/usb_process.c

Modified: head/sys/dev/usb/usb_hub.c
==============================================================================
--- head/sys/dev/usb/usb_hub.c	Mon Dec 19 07:48:04 2016	(r310241)
+++ head/sys/dev/usb/usb_hub.c	Mon Dec 19 09:28:12 2016	(r310242)
@@ -2261,6 +2261,11 @@ usb_needs_explore(struct usb_bus *bus, u
 
 	DPRINTF("\n");
 
+	if (cold != 0) {
+		DPRINTF("Cold\n");
+		return;
+	}
+
 	if (bus == NULL) {
 		DPRINTF("No bus pointer!\n");
 		return;
@@ -2326,6 +2331,26 @@ usb_needs_explore_all(void)
 }
 
 /*------------------------------------------------------------------------*
+ *	usb_needs_explore_init
+ *
+ * This function will ensure that the USB controllers are not enumerated
+ * until the "cold" variable is cleared.
+ *------------------------------------------------------------------------*/
+static void
+usb_needs_explore_init(void *arg)
+{
+	/*
+	 * The cold variable should be cleared prior to this function
+	 * being called:
+	 */
+	if (cold == 0)
+		usb_needs_explore_all();
+	else
+		DPRINTFN(-1, "Cold variable is still set!\n");
+}
+SYSINIT(usb_needs_explore_init, SI_SUB_KICK_SCHEDULER, SI_ORDER_SECOND, usb_needs_explore_init, NULL);
+
+/*------------------------------------------------------------------------*
  *	usb_bus_power_update
  *
  * This function will ensure that all USB devices on the given bus are

Modified: head/sys/dev/usb/usb_process.c
==============================================================================
--- head/sys/dev/usb/usb_process.c	Mon Dec 19 07:48:04 2016	(r310241)
+++ head/sys/dev/usb/usb_process.c	Mon Dec 19 09:28:12 2016	(r310242)
@@ -455,14 +455,15 @@ usb_proc_drain(struct usb_process *up)
 			up->up_csleep = 0;
 			cv_signal(&up->up_cv);
 		}
+#ifndef EARLY_AP_STARTUP
 		/* Check if we are still cold booted */
-
 		if (cold) {
 			USB_THREAD_SUSPEND(up->up_ptr);
 			printf("WARNING: A USB process has "
 			    "been left suspended\n");
 			break;
 		}
+#endif
 		cv_wait(&up->up_cv, up->up_mtx);
 	}
 	/* Check if someone is waiting - should not happen */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201612190928.uBJ9SDFc078376>