summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/usb_compat_linux.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/usb_compat_linux.c')
-rw-r--r--sys/dev/usb/usb_compat_linux.c27
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();
}
/*------------------------------------------------------------------------*
OpenPOWER on IntegriCloud