aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2022-08-30 14:01:43 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2022-09-06 08:45:21 +0000
commit7c39928455c5cbb22f9c3c92e541faa25d3418d8 (patch)
treed51a567e1d8f33cbd27008e6d2685394501908e7 /sys/dev
parentb5a56822610b551d72ccda40e3d5dd6705f31bbc (diff)
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/usb/serial/umodem.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/sys/dev/usb/serial/umodem.c b/sys/dev/usb/serial/umodem.c
index 346a6bc45c9a..a31821f63490 100644
--- a/sys/dev/usb/serial/umodem.c
+++ b/sys/dev/usb/serial/umodem.c
@@ -216,6 +216,7 @@ static void umodem_cfg_get_status(struct ucom_softc *, uint8_t *,
uint8_t *);
static int umodem_pre_param(struct ucom_softc *, struct termios *);
static void umodem_cfg_param(struct ucom_softc *, struct termios *);
+static void umodem_cfg_open(struct ucom_softc *);
static int umodem_ioctl(struct ucom_softc *, uint32_t, caddr_t, int,
struct thread *);
static void umodem_cfg_set_dtr(struct ucom_softc *, uint8_t);
@@ -282,6 +283,7 @@ static const struct ucom_callback umodem_callback = {
.ucom_cfg_set_break = &umodem_cfg_set_break,
.ucom_cfg_param = &umodem_cfg_param,
.ucom_pre_param = &umodem_pre_param,
+ .ucom_cfg_open = &umodem_cfg_open,
.ucom_ioctl = &umodem_ioctl,
.ucom_start_read = &umodem_start_read,
.ucom_stop_read = &umodem_stop_read,
@@ -451,14 +453,6 @@ umodem_attach(device_t dev)
goto detach;
}
- /* clear stall at first run, if USB host mode */
- if (uaa->usb_mode == USB_MODE_HOST) {
- mtx_lock(&sc->sc_mtx);
- usbd_xfer_set_stall(sc->sc_xfer[UMODEM_BULK_WR]);
- usbd_xfer_set_stall(sc->sc_xfer[UMODEM_BULK_RD]);
- mtx_unlock(&sc->sc_mtx);
- }
-
ucom_set_usb_mode(&sc->sc_super_ucom, uaa->usb_mode);
error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
@@ -637,6 +631,18 @@ umodem_cfg_param(struct ucom_softc *ucom, struct termios *t)
&req, &ls, 0, 1000);
}
+static void
+umodem_cfg_open(struct ucom_softc *ucom)
+{
+ struct umodem_softc *sc = ucom->sc_parent;
+
+ /* clear stall, if in USB host mode */
+ if ((sc->sc_super_ucom.sc_flag & UCOM_FLAG_DEVICE_MODE) == 0) {
+ usbd_xfer_set_stall(sc->sc_xfer[UMODEM_BULK_WR]);
+ usbd_xfer_set_stall(sc->sc_xfer[UMODEM_BULK_RD]);
+ }
+}
+
static int
umodem_ioctl(struct ucom_softc *ucom, uint32_t cmd, caddr_t data,
int flag, struct thread *td)