diff options
author | hselasky <hselasky@FreeBSD.org> | 2011-12-19 15:35:05 +0000 |
---|---|---|
committer | hselasky <hselasky@FreeBSD.org> | 2011-12-19 15:35:05 +0000 |
commit | 3a1f4384a11bb02c9788b4d5eb8445512c06c089 (patch) | |
tree | e99d8ca319c09cdba1dd9f96603bd5737bd602e1 | |
parent | 45e7ecc66ae5db3d7eaa312817bfadd0af045c18 (diff) | |
download | FreeBSD-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.c | 16 |
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); } |