diff options
author | Hans Petter Selasky <hselasky@FreeBSD.org> | 2014-08-05 06:38:21 +0000 |
---|---|---|
committer | Hans Petter Selasky <hselasky@FreeBSD.org> | 2014-08-05 06:38:21 +0000 |
commit | c3ccd2bf8cbf74c9d94dc989a8f2d7e62486c655 (patch) | |
tree | 0c8a2c13ef999163e5f61f50671933b6b531f3e9 /sys/dev/usb | |
parent | c65494287fc2dae372f68aa663ca072d29887f89 (diff) | |
download | src-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.c | 19 |
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); |