svn commit: r188907 - head/sys/dev/usb2/controller

Andrew Thompson thompsa at FreeBSD.org
Sat Feb 21 17:02:26 PST 2009


Author: thompsa
Date: Sun Feb 22 01:02:25 2009
New Revision: 188907
URL: http://svn.freebsd.org/changeset/base/188907

Log:
  Use root_mount_hold and root_mount_rel to allow the USB bus to be explored
  before trying to mount root. Unlike USB1 the busses are not explored at attach
  but rather after threads are running.

Modified:
  head/sys/dev/usb2/controller/usb2_bus.h
  head/sys/dev/usb2/controller/usb2_controller.c

Modified: head/sys/dev/usb2/controller/usb2_bus.h
==============================================================================
--- head/sys/dev/usb2/controller/usb2_bus.h	Sat Feb 21 23:46:34 2009	(r188906)
+++ head/sys/dev/usb2/controller/usb2_bus.h	Sun Feb 22 01:02:25 2009	(r188907)
@@ -53,6 +53,7 @@ struct usb2_bus {
 	struct usb2_bus_stat stats_ok;
 	struct usb2_process explore_proc;
 	struct usb2_process roothub_proc;
+	struct root_hold_token *bus_roothold;
 	/*
 	 * There are two callback processes. One for Giant locked
 	 * callbacks. One for non-Giant locked callbacks. This should

Modified: head/sys/dev/usb2/controller/usb2_controller.c
==============================================================================
--- head/sys/dev/usb2/controller/usb2_controller.c	Sat Feb 21 23:46:34 2009	(r188906)
+++ head/sys/dev/usb2/controller/usb2_controller.c	Sun Feb 22 01:02:25 2009	(r188907)
@@ -126,6 +126,10 @@ usb2_attach(device_t dev)
 		DPRINTFN(0, "USB device has no ivars\n");
 		return (ENXIO);
 	}
+
+	/* delay vfs_mountroot until the bus is explored */
+	bus->bus_roothold = root_mount_hold(device_get_nameunit(dev));
+
 	if (usb2_post_init_called) {
 		mtx_lock(&Giant);
 		usb2_attach_sub(dev, bus);
@@ -153,6 +157,10 @@ usb2_detach(device_t dev)
 	usb2_callout_drain(&bus->power_wdog);
 
 	/* Let the USB explore process detach all devices. */
+	if (bus->bus_roothold != NULL) {
+		root_mount_rel(bus->bus_roothold);
+		bus->bus_roothold = NULL;
+	}
 
 	USB_BUS_LOCK(bus);
 	if (usb2_proc_msignal(&bus->explore_proc,
@@ -225,6 +233,10 @@ usb2_bus_explore(struct usb2_proc_msg *p
 
 		USB_BUS_LOCK(bus);
 	}
+	if (bus->bus_roothold != NULL) {
+		root_mount_rel(bus->bus_roothold);
+		bus->bus_roothold = NULL;
+	}
 }
 
 /*------------------------------------------------------------------------*


More information about the svn-src-all mailing list