diff options
Diffstat (limited to 'sys/dev/usb/usb_compat_linux.c')
-rw-r--r-- | sys/dev/usb/usb_compat_linux.c | 27 |
1 files changed, 7 insertions, 20 deletions
diff --git a/sys/dev/usb/usb_compat_linux.c b/sys/dev/usb/usb_compat_linux.c index 604ac4d..00fc86b 100644 --- a/sys/dev/usb/usb_compat_linux.c +++ b/sys/dev/usb/usb_compat_linux.c @@ -215,14 +215,12 @@ usb_linux_probe(device_t dev) if (uaa->usb_mode != USB_MODE_HOST) { return (ENXIO); } - mtx_lock(&Giant); LIST_FOREACH(udrv, &usb_linux_driver_list, linux_driver_list) { if (usb_linux_lookup_id(udrv->id_table, uaa)) { err = 0; break; } } - mtx_unlock(&Giant); return (err); } @@ -239,9 +237,7 @@ usb_linux_get_usb_driver(struct usb_linux_softc *sc) { struct usb_driver *udrv; - mtx_lock(&Giant); udrv = sc->sc_udrv; - mtx_unlock(&Giant); return (udrv); } @@ -260,13 +256,11 @@ usb_linux_attach(device_t dev) struct usb_driver *udrv; const struct usb_device_id *id = NULL; - mtx_lock(&Giant); LIST_FOREACH(udrv, &usb_linux_driver_list, linux_driver_list) { id = usb_linux_lookup_id(udrv->id_table, uaa); if (id) break; } - mtx_unlock(&Giant); if (id == NULL) { return (ENXIO); @@ -287,9 +281,7 @@ usb_linux_attach(device_t dev) return (ENXIO); } } - mtx_lock(&Giant); LIST_INSERT_HEAD(&usb_linux_attached_list, sc, sc_attached_list); - mtx_unlock(&Giant); /* success */ return (0); @@ -307,14 +299,12 @@ usb_linux_detach(device_t dev) struct usb_linux_softc *sc = device_get_softc(dev); struct usb_driver *udrv = NULL; - mtx_lock(&Giant); if (sc->sc_attached_list.le_prev) { LIST_REMOVE(sc, sc_attached_list); sc->sc_attached_list.le_prev = NULL; udrv = sc->sc_udrv; sc->sc_udrv = NULL; } - mtx_unlock(&Giant); if (udrv && udrv->disconnect) { (udrv->disconnect) (sc->sc_ui); @@ -474,13 +464,10 @@ usb_unlink_bsd(struct usb_xfer *xfer, if (!usbd_transfer_pending(xfer)) return; if (xfer->priv_fifo == (void *)urb) { - if (drain) { - mtx_unlock(&Giant); + if (drain) usbd_transfer_drain(xfer); - mtx_lock(&Giant); - } else { + else usbd_transfer_stop(xfer); - } usbd_transfer_start(xfer); } } @@ -1148,9 +1135,9 @@ usb_linux_register(void *arg) { struct usb_driver *drv = arg; - mtx_lock(&Giant); + newbus_xlock(); LIST_INSERT_HEAD(&usb_linux_driver_list, drv, linux_driver_list); - mtx_unlock(&Giant); + newbus_xunlock(); usb_needs_explore_all(); } @@ -1172,16 +1159,16 @@ usb_linux_deregister(void *arg) struct usb_linux_softc *sc; repeat: - mtx_lock(&Giant); + newbus_xlock(); LIST_FOREACH(sc, &usb_linux_attached_list, sc_attached_list) { if (sc->sc_udrv == drv) { - mtx_unlock(&Giant); device_detach(sc->sc_fbsd_dev); + newbus_xunlock(); goto repeat; } } LIST_REMOVE(drv, linux_driver_list); - mtx_unlock(&Giant); + newbus_xunlock(); } /*------------------------------------------------------------------------* |