diff options
Diffstat (limited to 'sys/dev/usb/serial/uark.c')
-rw-r--r-- | sys/dev/usb/serial/uark.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/sys/dev/usb/serial/uark.c b/sys/dev/usb/serial/uark.c index ce76854..7246da7 100644 --- a/sys/dev/usb/serial/uark.c +++ b/sys/dev/usb/serial/uark.c @@ -73,6 +73,7 @@ struct uark_softc { struct usb2_xfer *sc_xfer[UARK_N_TRANSFER]; struct usb2_device *sc_udev; + struct mtx sc_mtx; uint8_t sc_msr; uint8_t sc_lsr; @@ -181,13 +182,14 @@ uark_attach(device_t dev) uint8_t iface_index; device_set_usb2_desc(dev); + mtx_init(&sc->sc_mtx, "uark", NULL, MTX_DEF); sc->sc_udev = uaa->device; iface_index = UARK_IFACE_INDEX; error = usb2_transfer_setup (uaa->device, &iface_index, sc->sc_xfer, - uark_xfer_config, UARK_N_TRANSFER, sc, &Giant); + uark_xfer_config, UARK_N_TRANSFER, sc, &sc->sc_mtx); if (error) { device_printf(dev, "allocating control USB " @@ -195,11 +197,13 @@ uark_attach(device_t dev) goto detach; } /* clear stall at first run */ + mtx_lock(&sc->sc_mtx); usb2_transfer_set_stall(sc->sc_xfer[UARK_BULK_DT_WR]); usb2_transfer_set_stall(sc->sc_xfer[UARK_BULK_DT_RD]); + mtx_unlock(&sc->sc_mtx); error = usb2_com_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc, - &uark_callback, &Giant); + &uark_callback, &sc->sc_mtx); if (error) { DPRINTF("usb2_com_attach failed\n"); goto detach; @@ -217,8 +221,8 @@ uark_detach(device_t dev) struct uark_softc *sc = device_get_softc(dev); usb2_com_detach(&sc->sc_super_ucom, &sc->sc_ucom, 1); - usb2_transfer_unsetup(sc->sc_xfer, UARK_N_TRANSFER); + mtx_destroy(&sc->sc_mtx); return (0); } |