aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/usb
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2014-08-05 06:38:21 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2014-08-05 06:38:21 +0000
commitc3ccd2bf8cbf74c9d94dc989a8f2d7e62486c655 (patch)
tree0c8a2c13ef999163e5f61f50671933b6b531f3e9 /sys/dev/usb
parentc65494287fc2dae372f68aa663ca072d29887f89 (diff)
downloadsrc-c3ccd2bf8cbf74c9d94dc989a8f2d7e62486c655.tar.gz
src-c3ccd2bf8cbf74c9d94dc989a8f2d7e62486c655.zip
Fix for deadlock in USB device side mode.
MFC after: 3 days
Notes
Notes: svn path=/head/; revision=269566
Diffstat (limited to 'sys/dev/usb')
-rw-r--r--sys/dev/usb/usb_device.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c
index 1acfd1eee95c..baf02334b77c 100644
--- a/sys/dev/usb/usb_device.c
+++ b/sys/dev/usb/usb_device.c
@@ -448,6 +448,17 @@ usb_endpoint_foreach(struct usb_device *udev, struct usb_endpoint *ep)
return (NULL);
}
+#if USB_HAVE_UGEN
+static uint16_t
+usb_get_refcount(struct usb_device *udev)
+{
+ if (usb_proc_is_called_from(USB_BUS_EXPLORE_PROC(udev->bus)) ||
+ usb_proc_is_called_from(USB_BUS_CONTROL_XFER_PROC(udev->bus)))
+ return (1);
+ return (2);
+}
+#endif
+
/*------------------------------------------------------------------------*
* usb_wait_pending_ref_locked
*
@@ -460,9 +471,7 @@ static void
usb_wait_pending_ref_locked(struct usb_device *udev)
{
#if USB_HAVE_UGEN
- const uint16_t refcount =
- usb_proc_is_called_from(
- USB_BUS_EXPLORE_PROC(udev->bus)) ? 1 : 2;
+ const uint16_t refcount = usb_get_refcount(udev);
DPRINTF("Refcount = %d\n", (int)refcount);
@@ -493,9 +502,7 @@ static void
usb_ref_restore_locked(struct usb_device *udev)
{
#if USB_HAVE_UGEN
- const uint16_t refcount =
- usb_proc_is_called_from(
- USB_BUS_EXPLORE_PROC(udev->bus)) ? 1 : 2;
+ const uint16_t refcount = usb_get_refcount(udev);
DPRINTF("Refcount = %d\n", (int)refcount);