summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2011-12-19 15:35:05 +0000
committerhselasky <hselasky@FreeBSD.org>2011-12-19 15:35:05 +0000
commit3a1f4384a11bb02c9788b4d5eb8445512c06c089 (patch)
treee99d8ca319c09cdba1dd9f96603bd5737bd602e1
parent45e7ecc66ae5db3d7eaa312817bfadd0af045c18 (diff)
downloadFreeBSD-src-3a1f4384a11bb02c9788b4d5eb8445512c06c089.zip
FreeBSD-src-3a1f4384a11bb02c9788b4d5eb8445512c06c089.tar.gz
Add code to wait for USB shutdown to be executed at system shutdown.
Add sysctl which can be used to skip this waiting. MFC after: 3 days
-rw-r--r--sys/dev/usb/controller/usb_controller.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/sys/dev/usb/controller/usb_controller.c b/sys/dev/usb/controller/usb_controller.c
index 6454e81..89920c9 100644
--- a/sys/dev/usb/controller/usb_controller.c
+++ b/sys/dev/usb/controller/usb_controller.c
@@ -87,7 +87,12 @@ SYSCTL_INT(_hw_usb_ctrl, OID_AUTO, debug, CTLFLAG_RW, &usb_ctrl_debug, 0,
static int usb_no_boot_wait = 0;
TUNABLE_INT("hw.usb.no_boot_wait", &usb_no_boot_wait);
SYSCTL_INT(_hw_usb, OID_AUTO, no_boot_wait, CTLFLAG_RDTUN, &usb_no_boot_wait, 0,
- "No device enumerate waiting at boot.");
+ "No USB device enumerate waiting at boot.");
+
+static int usb_no_shutdown_wait = 0;
+TUNABLE_INT("hw.usb.no_shutdown_wait", &usb_no_shutdown_wait);
+SYSCTL_INT(_hw_usb, OID_AUTO, no_shutdown_wait, CTLFLAG_RDTUN, &usb_no_shutdown_wait, 0,
+ "No USB device waiting at system shutdown.");
static devclass_t usb_devclass;
@@ -277,11 +282,20 @@ usb_shutdown(device_t dev)
return (0);
}
+ device_printf(bus->bdev, "Controller shutdown\n");
+
USB_BUS_LOCK(bus);
usb_proc_msignal(&bus->explore_proc,
&bus->shutdown_msg[0], &bus->shutdown_msg[1]);
+ if (usb_no_shutdown_wait == 0) {
+ /* wait for shutdown callback to be executed */
+ usb_proc_mwait(&bus->explore_proc,
+ &bus->shutdown_msg[0], &bus->shutdown_msg[1]);
+ }
USB_BUS_UNLOCK(bus);
+ device_printf(bus->bdev, "Controller shutdown complete\n");
+
return (0);
}
OpenPOWER on IntegriCloud