summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2012-08-13 18:34:04 +0000
committerhselasky <hselasky@FreeBSD.org>2012-08-13 18:34:04 +0000
commit8158b0ddf009ee71750ac879c96c227ea474aaf9 (patch)
treed39c884c99ca35714037967bd8e91168f43b5d8b
parentac49f9f94c356dc44ea69f7a8dfe014bc91c5806 (diff)
downloadFreeBSD-src-8158b0ddf009ee71750ac879c96c227ea474aaf9.zip
FreeBSD-src-8158b0ddf009ee71750ac879c96c227ea474aaf9.tar.gz
Fix for missing locks due to recent change.
PR: usb/170606 MFC after: 2 weeks
-rw-r--r--sys/dev/usb/usb_device.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c
index 407d2ea..4b5b0e5 100644
--- a/sys/dev/usb/usb_device.c
+++ b/sys/dev/usb/usb_device.c
@@ -2777,8 +2777,15 @@ usbd_set_endpoint_mode(struct usb_device *udev, struct usb_endpoint *ep,
uint8_t ep_mode)
{
usb_error_t error;
+ uint8_t do_unlock;
- sx_assert(&udev->enum_sx, SA_LOCKED);
+ /* automatic locking */
+ if (usbd_enum_is_locked(udev)) {
+ do_unlock = 0;
+ } else {
+ do_unlock = 1;
+ usbd_enum_lock(udev);
+ }
if (udev->bus->methods->set_endpoint_mode != NULL) {
error = (udev->bus->methods->set_endpoint_mode) (
@@ -2792,6 +2799,9 @@ usbd_set_endpoint_mode(struct usb_device *udev, struct usb_endpoint *ep,
/* only set new mode regardless of error */
ep->ep_mode = ep_mode;
+ if (do_unlock)
+ usbd_enum_unlock(udev);
+
return (error);
}
OpenPOWER on IntegriCloud