summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/controller/usb_controller.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/controller/usb_controller.c')
-rw-r--r--sys/dev/usb/controller/usb_controller.c30
1 files changed, 9 insertions, 21 deletions
diff --git a/sys/dev/usb/controller/usb_controller.c b/sys/dev/usb/controller/usb_controller.c
index 7a019dc..f6776f01 100644
--- a/sys/dev/usb/controller/usb_controller.c
+++ b/sys/dev/usb/controller/usb_controller.c
@@ -143,9 +143,7 @@ usb_attach(device_t dev)
}
if (usb_post_init_called) {
- mtx_lock(&Giant);
usb_attach_sub(dev, bus);
- mtx_unlock(&Giant);
usb_needs_explore(bus, 1);
}
return (0); /* return success */
@@ -228,20 +226,13 @@ usb_bus_explore(struct usb_proc_msg *pm)
}
USB_BUS_UNLOCK(bus);
- mtx_lock(&Giant);
-
/*
* First update the USB power state!
*/
usb_bus_powerd(bus);
- /*
- * Explore the Root USB HUB. This call can sleep,
- * exiting Giant, which is actually Giant.
- */
- (udev->hub->explore) (udev);
-
- mtx_unlock(&Giant);
+ /* Explore the Root USB HUB. */
+ (udev->hub->explore) (udev);
USB_BUS_LOCK(bus);
}
if (bus->bus_roothold != NULL) {
@@ -269,7 +260,7 @@ usb_bus_detach(struct usb_proc_msg *pm)
device_set_softc(dev, NULL);
USB_BUS_UNLOCK(bus);
- mtx_lock(&Giant);
+ newbus_xlock();
/* detach children first */
bus_generic_detach(dev);
@@ -281,7 +272,7 @@ usb_bus_detach(struct usb_proc_msg *pm)
usb_free_device(udev,
USB_UNCFG_FLAG_FREE_EP0);
- mtx_unlock(&Giant);
+ newbus_xunlock();
USB_BUS_LOCK(bus);
/* clear bdev variable last */
bus->bdev = NULL;
@@ -350,7 +341,7 @@ usb_bus_attach(struct usb_proc_msg *pm)
}
USB_BUS_UNLOCK(bus);
- mtx_lock(&Giant); /* XXX not required by USB */
+ newbus_xlock();
/* default power_mask value */
bus->hw_power_state =
@@ -383,7 +374,7 @@ usb_bus_attach(struct usb_proc_msg *pm)
err = USB_ERR_NOMEM;
}
- mtx_unlock(&Giant);
+ newbus_xunlock();
USB_BUS_LOCK(bus);
if (err) {
@@ -472,7 +463,7 @@ usb_post_init(void *arg)
int max;
int n;
- mtx_lock(&Giant);
+ newbus_xlock();
usb_devclass_ptr = devclass_find("usbus");
@@ -483,11 +474,8 @@ usb_post_init(void *arg)
dev = devclass_get_device(dc, n);
if (dev && device_is_attached(dev)) {
bus = device_get_ivars(dev);
- if (bus) {
- mtx_lock(&Giant);
+ if (bus)
usb_attach_sub(dev, bus);
- mtx_unlock(&Giant);
- }
}
}
} else {
@@ -499,7 +487,7 @@ usb_post_init(void *arg)
usb_needs_explore_all();
- mtx_unlock(&Giant);
+ newbus_xunlock();
}
SYSINIT(usb_post_init, SI_SUB_KICK_SCHEDULER, SI_ORDER_ANY, usb_post_init, NULL);
OpenPOWER on IntegriCloud