summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/serial/umodem.c
diff options
context:
space:
mode:
authorthompsa <thompsa@FreeBSD.org>2009-03-02 02:44:10 +0000
committerthompsa <thompsa@FreeBSD.org>2009-03-02 02:44:10 +0000
commit4613abf36a1a86bece089d14c8f98998cc45c0fa (patch)
tree74b7a00cf7a7405145b74c9131304c9b7ec5803a /sys/dev/usb/serial/umodem.c
parentddc28333969dfde04f6c179cab0e3cd36971ddde (diff)
downloadFreeBSD-src-4613abf36a1a86bece089d14c8f98998cc45c0fa.zip
FreeBSD-src-4613abf36a1a86bece089d14c8f98998cc45c0fa.tar.gz
Move the serial drivers from Giant to using their own mutexs.
Tested with: u3g, ubser, uplcom
Diffstat (limited to 'sys/dev/usb/serial/umodem.c')
-rw-r--r--sys/dev/usb/serial/umodem.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/sys/dev/usb/serial/umodem.c b/sys/dev/usb/serial/umodem.c
index 50d938b..0bfacd6 100644
--- a/sys/dev/usb/serial/umodem.c
+++ b/sys/dev/usb/serial/umodem.c
@@ -142,6 +142,7 @@ struct umodem_softc {
struct usb2_xfer *sc_xfer[UMODEM_N_TRANSFER];
struct usb2_device *sc_udev;
+ struct mtx sc_mtx;
uint16_t sc_line;
@@ -288,6 +289,7 @@ umodem_attach(device_t dev)
int error;
device_set_usb2_desc(dev);
+ mtx_init(&sc->sc_mtx, "umodem", NULL, MTX_DEF);
sc->sc_ctrl_iface_no = uaa->info.bIfaceNum;
sc->sc_iface_index[1] = uaa->info.bIfaceIndex;
@@ -348,17 +350,19 @@ umodem_attach(device_t dev)
error = usb2_transfer_setup(uaa->device,
sc->sc_iface_index, sc->sc_xfer,
umodem_config, UMODEM_N_TRANSFER,
- sc, &Giant);
+ sc, &sc->sc_mtx);
if (error) {
goto detach;
}
/* clear stall at first run */
+ mtx_lock(&sc->sc_mtx);
usb2_transfer_set_stall(sc->sc_xfer[UMODEM_BULK_WR]);
usb2_transfer_set_stall(sc->sc_xfer[UMODEM_BULK_RD]);
+ mtx_unlock(&sc->sc_mtx);
error = usb2_com_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
- &umodem_callback, &Giant);
+ &umodem_callback, &sc->sc_mtx);
if (error) {
goto detach;
}
@@ -781,8 +785,8 @@ umodem_detach(device_t dev)
DPRINTF("sc=%p\n", sc);
usb2_com_detach(&sc->sc_super_ucom, &sc->sc_ucom, 1);
-
usb2_transfer_unsetup(sc->sc_xfer, UMODEM_N_TRANSFER);
+ mtx_destroy(&sc->sc_mtx);
return (0);
}
OpenPOWER on IntegriCloud