--- a/sys/bus/u4b/serial/uark.c +++ b/sys/bus/u4b/serial/uark.c @@ -74,6 +74,9 @@ #define UARK_CONFIG_INDEX 0 #define UARK_IFACE_INDEX 0 +/* bounded timeout for cfg-path (tty ioctl / open / close) EP0 requests */ +#define UARK_CFG_TIMEOUT 250 /* ms */ + enum { UARK_BULK_DT_WR, UARK_BULK_DT_RD, @@ -110,7 +113,8 @@ static void uark_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *); static void uark_cfg_set_break(struct ucom_softc *, uint8_t); -static void uark_cfg_write(struct uark_softc *, uint16_t, uint16_t); +static usb_error_t uark_cfg_write(struct uark_softc *, uint16_t, + uint16_t); static void uark_poll(struct ucom_softc *ucom); static const struct usb_config @@ -358,10 +362,14 @@ */ data = (UARK_BAUD_REF + (speed / 2)) / speed; - uark_cfg_write(sc, 3, 0x83); - uark_cfg_write(sc, 0, data & 0xFF); - uark_cfg_write(sc, 1, data >> 8); - uark_cfg_write(sc, 3, 0x03); + if (uark_cfg_write(sc, 3, 0x83) != 0) + return; + if (uark_cfg_write(sc, 0, data & 0xFF) != 0) + return; + if (uark_cfg_write(sc, 1, data >> 8) != 0) + return; + if (uark_cfg_write(sc, 3, 0x03) != 0) + return; if (t->c_cflag & CSTOPB) data = UARK_STOP_BITS_2; @@ -391,7 +399,8 @@ data |= UARK_SET_DATA_BITS(8); break; } - uark_cfg_write(sc, 3, 0x00); + if (uark_cfg_write(sc, 3, 0x00) != 0) + return; uark_cfg_write(sc, 3, data); } @@ -414,7 +423,7 @@ uark_cfg_write(sc, 4, onoff ? 0x01 : 0x00); } -static void +static usb_error_t uark_cfg_write(struct uark_softc *sc, uint16_t index, uint16_t value) { struct usb_device_request req; @@ -426,12 +435,13 @@ USETW(req.wIndex, index); USETW(req.wLength, 0); - err = ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom, - &req, NULL, 0, 1000); + err = ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom, + &req, NULL, 0, UARK_CFG_TIMEOUT); if (err) { - DPRINTFN(0, "device request failed, err=%s " - "(ignored)\n", usbd_errstr(err)); + DPRINTFN(0, "device request failed, err=%s\n", + usbd_errstr(err)); } + return (err); } static void