Lines Matching +full:buffered +full:- +full:negative
1 // SPDX-License-Identifier: GPL-2.0+
3 * Digi AccelePort USB-4 and USB-2 Serial Converters
7 * Shamelessly based on Brian Warner's keyspan_pda.c and Greg Kroah-Hartman's
8 * usb-serial driver.
31 #define DRIVER_DESC "Digi AccelePort USB-2/USB-4 Serial Converter driver"
33 /* port output buffer length -- must be <= transfer buffer length - 2 */
37 /* port input buffer length -- must be >= transfer buffer length - 3 */
54 #define DIGI_2_ID 0x0002 /* USB-2 */
55 #define DIGI_4_ID 0x0004 /* USB-4 */
58 * "INB": can be used on the in-band endpoint
59 * "OOB": can be used on the out-of-band endpoint
182 struct usb_serial_port *ds_oob_port; /* out-of-band port */
183 int ds_oob_port_num; /* index of out-of-band port */
363 * if successful, -EINTR if interrupted while sleeping and
364 * the interruptible flag is true, or a negative error
373 …(struct usb_serial_port *)((struct digi_serial *)(usb_get_serial_data(port->serial)))->ds_oob_port; in digi_write_oob_command()
377 dev_dbg(&port->dev, in digi_write_oob_command()
379 oob_priv->dp_port_num, count); in digi_write_oob_command()
381 spin_lock_irqsave(&oob_priv->dp_port_lock, flags); in digi_write_oob_command()
383 while (oob_priv->dp_write_urb_in_use) { in digi_write_oob_command()
385 &oob_priv->write_wait, DIGI_RETRY_TIMEOUT, in digi_write_oob_command()
386 &oob_priv->dp_port_lock, flags); in digi_write_oob_command()
388 return -EINTR; in digi_write_oob_command()
389 spin_lock_irqsave(&oob_priv->dp_port_lock, flags); in digi_write_oob_command()
393 len = min(count, oob_port->bulk_out_size); in digi_write_oob_command()
396 memcpy(oob_port->write_urb->transfer_buffer, buf, len); in digi_write_oob_command()
397 oob_port->write_urb->transfer_buffer_length = len; in digi_write_oob_command()
398 ret = usb_submit_urb(oob_port->write_urb, GFP_ATOMIC); in digi_write_oob_command()
400 oob_priv->dp_write_urb_in_use = 1; in digi_write_oob_command()
401 count -= len; in digi_write_oob_command()
405 spin_unlock_irqrestore(&oob_priv->dp_port_lock, flags); in digi_write_oob_command()
407 dev_err(&port->dev, "%s: usb_submit_urb failed, ret=%d\n", in digi_write_oob_command()
420 * is non-zero, write in band command will return after
422 * timeout ticks. Returns 0 if successful, or a negative
432 unsigned char *data = port->write_urb->transfer_buffer; in digi_write_inb_command()
435 dev_dbg(&port->dev, "digi_write_inb_command: TOP: port=%d, count=%d\n", in digi_write_inb_command()
436 priv->dp_port_num, count); in digi_write_inb_command()
443 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_write_inb_command()
445 while (priv->dp_write_urb_in_use && in digi_write_inb_command()
448 &priv->write_wait, DIGI_RETRY_TIMEOUT, in digi_write_inb_command()
449 &priv->dp_port_lock, flags); in digi_write_inb_command()
451 return -EINTR; in digi_write_inb_command()
452 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_write_inb_command()
456 /* guarantee the write will send buffered data first, */ in digi_write_inb_command()
458 len = min(count, port->bulk_out_size-2-priv->dp_out_buf_len); in digi_write_inb_command()
462 /* write any buffered data first */ in digi_write_inb_command()
463 if (priv->dp_out_buf_len > 0) { in digi_write_inb_command()
465 data[1] = priv->dp_out_buf_len; in digi_write_inb_command()
466 memcpy(data + 2, priv->dp_out_buf, in digi_write_inb_command()
467 priv->dp_out_buf_len); in digi_write_inb_command()
468 memcpy(data + 2 + priv->dp_out_buf_len, buf, len); in digi_write_inb_command()
469 port->write_urb->transfer_buffer_length in digi_write_inb_command()
470 = priv->dp_out_buf_len + 2 + len; in digi_write_inb_command()
473 port->write_urb->transfer_buffer_length = len; in digi_write_inb_command()
476 ret = usb_submit_urb(port->write_urb, GFP_ATOMIC); in digi_write_inb_command()
478 priv->dp_write_urb_in_use = 1; in digi_write_inb_command()
479 priv->dp_out_buf_len = 0; in digi_write_inb_command()
480 count -= len; in digi_write_inb_command()
485 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_write_inb_command()
488 dev_err(&port->dev, in digi_write_inb_command()
490 __func__, ret, priv->dp_port_num); in digi_write_inb_command()
501 * -EINTR if interrupted while sleeping, or a non-zero error
511 …struct usb_serial_port *) ((struct digi_serial *)(usb_get_serial_data(port->serial)))->ds_oob_port; in digi_set_modem_signals()
513 unsigned char *data = oob_port->write_urb->transfer_buffer; in digi_set_modem_signals()
516 dev_dbg(&port->dev, in digi_set_modem_signals()
518 port_priv->dp_port_num, modem_signals); in digi_set_modem_signals()
520 spin_lock_irqsave(&oob_priv->dp_port_lock, flags); in digi_set_modem_signals()
521 spin_lock(&port_priv->dp_port_lock); in digi_set_modem_signals()
523 while (oob_priv->dp_write_urb_in_use) { in digi_set_modem_signals()
524 spin_unlock(&port_priv->dp_port_lock); in digi_set_modem_signals()
526 &oob_priv->write_wait, DIGI_RETRY_TIMEOUT, in digi_set_modem_signals()
527 &oob_priv->dp_port_lock, flags); in digi_set_modem_signals()
529 return -EINTR; in digi_set_modem_signals()
530 spin_lock_irqsave(&oob_priv->dp_port_lock, flags); in digi_set_modem_signals()
531 spin_lock(&port_priv->dp_port_lock); in digi_set_modem_signals()
534 data[1] = port_priv->dp_port_num; in digi_set_modem_signals()
539 data[5] = port_priv->dp_port_num; in digi_set_modem_signals()
544 oob_port->write_urb->transfer_buffer_length = 8; in digi_set_modem_signals()
546 ret = usb_submit_urb(oob_port->write_urb, GFP_ATOMIC); in digi_set_modem_signals()
548 oob_priv->dp_write_urb_in_use = 1; in digi_set_modem_signals()
549 port_priv->dp_modem_signals &= ~(TIOCM_DTR | TIOCM_RTS); in digi_set_modem_signals()
550 port_priv->dp_modem_signals |= in digi_set_modem_signals()
553 spin_unlock(&port_priv->dp_port_lock); in digi_set_modem_signals()
554 spin_unlock_irqrestore(&oob_priv->dp_port_lock, flags); in digi_set_modem_signals()
556 dev_err(&port->dev, "%s: usb_submit_urb failed, ret=%d\n", in digi_set_modem_signals()
565 * to go idle. It returns 0 if successful or a negative error.
581 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_transmit_idle()
582 priv->dp_transmit_idle = 0; in digi_transmit_idle()
583 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_transmit_idle()
590 ret = digi_write_inb_command(port, buf, 2, timeout - jiffies); in digi_transmit_idle()
594 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_transmit_idle()
596 while (time_before(jiffies, timeout) && !priv->dp_transmit_idle) { in digi_transmit_idle()
598 &priv->dp_transmit_idle_wait, DIGI_RETRY_TIMEOUT, in digi_transmit_idle()
599 &priv->dp_port_lock, flags); in digi_transmit_idle()
601 return -EINTR; in digi_transmit_idle()
602 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_transmit_idle()
604 priv->dp_transmit_idle = 0; in digi_transmit_idle()
605 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_transmit_idle()
614 struct usb_serial_port *port = tty->driver_data; in digi_rx_throttle()
618 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_rx_throttle()
619 priv->dp_throttled = 1; in digi_rx_throttle()
620 priv->dp_throttle_restart = 0; in digi_rx_throttle()
621 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_rx_throttle()
629 struct usb_serial_port *port = tty->driver_data; in digi_rx_unthrottle()
632 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_rx_unthrottle()
635 if (priv->dp_throttle_restart) in digi_rx_unthrottle()
636 ret = usb_submit_urb(port->read_urb, GFP_ATOMIC); in digi_rx_unthrottle()
639 priv->dp_throttled = 0; in digi_rx_unthrottle()
640 priv->dp_throttle_restart = 0; in digi_rx_unthrottle()
642 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_rx_unthrottle()
645 dev_err(&port->dev, in digi_rx_unthrottle()
647 __func__, ret, priv->dp_port_num); in digi_rx_unthrottle()
655 struct device *dev = &port->dev; in digi_set_termios()
656 unsigned int iflag = tty->termios.c_iflag; in digi_set_termios()
657 unsigned int cflag = tty->termios.c_cflag; in digi_set_termios()
658 unsigned int old_iflag = old_termios->c_iflag; in digi_set_termios()
659 unsigned int old_cflag = old_termios->c_cflag; in digi_set_termios()
668 priv->dp_port_num, iflag, old_iflag, cflag, old_cflag); in digi_set_termios()
673 arg = -1; in digi_set_termios()
710 if (arg != -1) { in digi_set_termios()
712 buf[i++] = priv->dp_port_num; in digi_set_termios()
718 tty->termios.c_cflag &= ~CMSPAR; in digi_set_termios()
730 buf[i++] = priv->dp_port_num; in digi_set_termios()
736 arg = -1; in digi_set_termios()
749 if (arg != -1) { in digi_set_termios()
751 buf[i++] = priv->dp_port_num; in digi_set_termios()
767 buf[i++] = priv->dp_port_num; in digi_set_termios()
785 /* On USB-4 it is necessary to assert RTS prior */ in digi_set_termios()
788 buf[i++] = priv->dp_port_num; in digi_set_termios()
796 buf[i++] = priv->dp_port_num; in digi_set_termios()
816 buf[i++] = priv->dp_port_num; in digi_set_termios()
829 buf[i++] = priv->dp_port_num; in digi_set_termios()
842 struct usb_serial_port *port = tty->driver_data; in digi_break_ctl()
855 struct usb_serial_port *port = tty->driver_data; in digi_tiocmget()
860 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_tiocmget()
861 val = priv->dp_modem_signals; in digi_tiocmget()
862 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_tiocmget()
870 struct usb_serial_port *port = tty->driver_data; in digi_tiocmset()
875 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_tiocmset()
876 val = (priv->dp_modem_signals & ~clear) | set; in digi_tiocmset()
877 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_tiocmset()
888 unsigned char *data = port->write_urb->transfer_buffer; in digi_write()
891 dev_dbg(&port->dev, "digi_write: TOP: port=%d, count=%d\n", in digi_write()
892 priv->dp_port_num, count); in digi_write()
895 count = min(count, port->bulk_out_size-2); in digi_write()
900 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_write()
903 if (priv->dp_write_urb_in_use) { in digi_write()
905 if (count == 1 && priv->dp_out_buf_len < DIGI_OUT_BUF_SIZE) { in digi_write()
906 priv->dp_out_buf[priv->dp_out_buf_len++] = *buf; in digi_write()
911 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_write()
915 /* allow space for any buffered data and for new data, up to */ in digi_write()
916 /* transfer buffer size - 2 (for command and length bytes) */ in digi_write()
917 new_len = min(count, port->bulk_out_size-2-priv->dp_out_buf_len); in digi_write()
918 data_len = new_len + priv->dp_out_buf_len; in digi_write()
921 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_write()
925 port->write_urb->transfer_buffer_length = data_len+2; in digi_write()
930 /* copy in buffered data first */ in digi_write()
931 memcpy(data, priv->dp_out_buf, priv->dp_out_buf_len); in digi_write()
932 data += priv->dp_out_buf_len; in digi_write()
937 ret = usb_submit_urb(port->write_urb, GFP_ATOMIC); in digi_write()
939 priv->dp_write_urb_in_use = 1; in digi_write()
941 priv->dp_out_buf_len = 0; in digi_write()
945 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_write()
949 __func__, ret, priv->dp_port_num); in digi_write()
950 dev_dbg(&port->dev, "digi_write: returning %d\n", ret); in digi_write()
958 struct usb_serial_port *port = urb->context; in digi_write_bulk_callback()
964 int status = urb->status; in digi_write_bulk_callback()
969 pr_err("%s: port or port->private is NULL, status=%d\n", in digi_write_bulk_callback()
973 serial = port->serial; in digi_write_bulk_callback()
975 dev_err(&port->dev, in digi_write_bulk_callback()
976 "%s: serial or serial->private is NULL, status=%d\n", in digi_write_bulk_callback()
982 if (priv->dp_port_num == serial_priv->ds_oob_port_num) { in digi_write_bulk_callback()
983 dev_dbg(&port->dev, "digi_write_bulk_callback: oob callback\n"); in digi_write_bulk_callback()
984 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_write_bulk_callback()
985 priv->dp_write_urb_in_use = 0; in digi_write_bulk_callback()
986 wake_up_interruptible(&priv->write_wait); in digi_write_bulk_callback()
987 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_write_bulk_callback()
991 /* try to send any buffered data on this port */ in digi_write_bulk_callback()
993 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_write_bulk_callback()
994 priv->dp_write_urb_in_use = 0; in digi_write_bulk_callback()
995 if (priv->dp_out_buf_len > 0) { in digi_write_bulk_callback()
996 *((unsigned char *)(port->write_urb->transfer_buffer)) in digi_write_bulk_callback()
998 *((unsigned char *)(port->write_urb->transfer_buffer) + 1) in digi_write_bulk_callback()
999 = (unsigned char)priv->dp_out_buf_len; in digi_write_bulk_callback()
1000 port->write_urb->transfer_buffer_length = in digi_write_bulk_callback()
1001 priv->dp_out_buf_len + 2; in digi_write_bulk_callback()
1002 memcpy(port->write_urb->transfer_buffer + 2, priv->dp_out_buf, in digi_write_bulk_callback()
1003 priv->dp_out_buf_len); in digi_write_bulk_callback()
1004 ret = usb_submit_urb(port->write_urb, GFP_ATOMIC); in digi_write_bulk_callback()
1006 priv->dp_write_urb_in_use = 1; in digi_write_bulk_callback()
1007 priv->dp_out_buf_len = 0; in digi_write_bulk_callback()
1011 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_write_bulk_callback()
1013 if (ret && ret != -EPERM) in digi_write_bulk_callback()
1016 __func__, ret, priv->dp_port_num); in digi_write_bulk_callback()
1019 tty_port_tty_wakeup(&port->port); in digi_write_bulk_callback()
1024 struct usb_serial_port *port = tty->driver_data; in digi_write_room()
1029 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_write_room()
1031 if (priv->dp_write_urb_in_use) in digi_write_room()
1034 room = port->bulk_out_size - 2 - priv->dp_out_buf_len; in digi_write_room()
1036 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_write_room()
1037 dev_dbg(&port->dev, "digi_write_room: port=%d, room=%u\n", priv->dp_port_num, room); in digi_write_room()
1044 struct usb_serial_port *port = tty->driver_data; in digi_chars_in_buffer()
1049 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_chars_in_buffer()
1050 if (priv->dp_write_urb_in_use) in digi_chars_in_buffer()
1051 chars = port->bulk_out_size - 2; in digi_chars_in_buffer()
1053 chars = priv->dp_out_buf_len; in digi_chars_in_buffer()
1054 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_chars_in_buffer()
1056 dev_dbg(&port->dev, "%s: port=%d, chars=%d\n", __func__, in digi_chars_in_buffer()
1057 priv->dp_port_num, chars); in digi_chars_in_buffer()
1075 if (digi_startup_device(port->serial) != 0) in digi_open()
1076 return -ENXIO; in digi_open()
1080 buf[1] = priv->dp_port_num; in digi_open()
1086 buf[5] = priv->dp_port_num; in digi_open()
1092 dev_dbg(&port->dev, "digi_open: write oob failed, ret=%d\n", ret); in digi_open()
1096 not_termios.c_cflag = ~tty->termios.c_cflag; in digi_open()
1097 not_termios.c_iflag = ~tty->termios.c_iflag; in digi_open()
1111 mutex_lock(&port->serial->disc_mutex); in digi_close()
1113 if (port->serial->disconnected) in digi_close()
1121 buf[1] = priv->dp_port_num; in digi_close()
1127 buf[5] = priv->dp_port_num; in digi_close()
1133 buf[9] = priv->dp_port_num; in digi_close()
1139 buf[13] = priv->dp_port_num; in digi_close()
1145 buf[17] = priv->dp_port_num; in digi_close()
1151 dev_dbg(&port->dev, "digi_close: write oob failed, ret=%d\n", in digi_close()
1154 prepare_to_wait(&priv->dp_flush_wait, &wait, in digi_close()
1157 finish_wait(&priv->dp_flush_wait, &wait); in digi_close()
1160 usb_kill_urb(port->write_urb); in digi_close()
1162 spin_lock_irq(&priv->dp_port_lock); in digi_close()
1163 priv->dp_write_urb_in_use = 0; in digi_close()
1164 wake_up_interruptible(&priv->dp_close_wait); in digi_close()
1165 spin_unlock_irq(&priv->dp_port_lock); in digi_close()
1166 mutex_unlock(&port->serial->disc_mutex); in digi_close()
1174 * urbs initialized. Returns 0 if successful, non-zero error otherwise.
1184 spin_lock(&serial_priv->ds_serial_lock); in digi_startup_device()
1185 if (serial_priv->ds_device_started) { in digi_startup_device()
1186 spin_unlock(&serial_priv->ds_serial_lock); in digi_startup_device()
1189 serial_priv->ds_device_started = 1; in digi_startup_device()
1190 spin_unlock(&serial_priv->ds_serial_lock); in digi_startup_device()
1194 for (i = 0; i < serial->type->num_ports + 1; i++) { in digi_startup_device()
1195 port = serial->port[i]; in digi_startup_device()
1196 ret = usb_submit_urb(port->read_urb, GFP_KERNEL); in digi_startup_device()
1198 dev_err(&port->dev, in digi_startup_device()
1213 return -ENOMEM; in digi_port_init()
1215 spin_lock_init(&priv->dp_port_lock); in digi_port_init()
1216 priv->dp_port_num = port_num; in digi_port_init()
1217 init_waitqueue_head(&priv->dp_transmit_idle_wait); in digi_port_init()
1218 init_waitqueue_head(&priv->dp_flush_wait); in digi_port_init()
1219 init_waitqueue_head(&priv->dp_close_wait); in digi_port_init()
1220 init_waitqueue_head(&priv->write_wait); in digi_port_init()
1221 priv->dp_port = port; in digi_port_init()
1235 return -ENOMEM; in digi_startup()
1237 spin_lock_init(&serial_priv->ds_serial_lock); in digi_startup()
1238 serial_priv->ds_oob_port_num = serial->type->num_ports; in digi_startup()
1239 serial_priv->ds_oob_port = serial->port[serial_priv->ds_oob_port_num]; in digi_startup()
1241 ret = digi_port_init(serial_priv->ds_oob_port, in digi_startup()
1242 serial_priv->ds_oob_port_num); in digi_startup()
1259 for (i = 0; i < serial->type->num_ports + 1; i++) { in digi_disconnect()
1260 usb_kill_urb(serial->port[i]->read_urb); in digi_disconnect()
1261 usb_kill_urb(serial->port[i]->write_urb); in digi_disconnect()
1273 priv = usb_get_serial_port_data(serial_priv->ds_oob_port); in digi_release()
1281 return digi_port_init(port, port->port_number); in digi_port_probe()
1294 struct usb_serial_port *port = urb->context; in digi_read_bulk_callback()
1298 int status = urb->status; in digi_read_bulk_callback()
1305 dev_err(&port->dev, "%s: port->private is NULL, status=%d\n", in digi_read_bulk_callback()
1309 if (port->serial == NULL || in digi_read_bulk_callback()
1310 (serial_priv = usb_get_serial_data(port->serial)) == NULL) { in digi_read_bulk_callback()
1311 dev_err(&port->dev, "%s: serial is bad or serial->private " in digi_read_bulk_callback()
1318 dev_err(&port->dev, in digi_read_bulk_callback()
1320 __func__, status, priv->dp_port_num); in digi_read_bulk_callback()
1325 if (priv->dp_port_num == serial_priv->ds_oob_port_num) { in digi_read_bulk_callback()
1335 if (ret != 0 && ret != -EPERM) { in digi_read_bulk_callback()
1336 dev_err(&port->dev, in digi_read_bulk_callback()
1338 __func__, ret, priv->dp_port_num); in digi_read_bulk_callback()
1348 * port->private are not NULL and port->serial has been validated.
1350 * throttled, and -1 if the sanity checks failed.
1355 struct usb_serial_port *port = urb->context; in digi_read_inb_callback()
1357 unsigned char *buf = urb->transfer_buffer; in digi_read_inb_callback()
1366 if (urb->actual_length < 2) { in digi_read_inb_callback()
1367 dev_warn(&port->dev, "short packet received\n"); in digi_read_inb_callback()
1368 return -1; in digi_read_inb_callback()
1374 if (urb->actual_length != len + 2) { in digi_read_inb_callback()
1375 dev_err(&port->dev, "malformed packet received: port=%d, opcode=%d, len=%d, actual_length=%u\n", in digi_read_inb_callback()
1376 priv->dp_port_num, opcode, len, urb->actual_length); in digi_read_inb_callback()
1377 return -1; in digi_read_inb_callback()
1381 dev_err(&port->dev, "malformed data packet received\n"); in digi_read_inb_callback()
1382 return -1; in digi_read_inb_callback()
1385 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_read_inb_callback()
1389 throttled = priv->dp_throttled; in digi_read_inb_callback()
1391 priv->dp_throttle_restart = 1; in digi_read_inb_callback()
1403 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN); in digi_read_inb_callback()
1414 /* data length is len-1 (one byte of len is port_status) */ in digi_read_inb_callback()
1415 --len; in digi_read_inb_callback()
1417 tty_insert_flip_string_fixed_flag(&port->port, data, in digi_read_inb_callback()
1419 tty_flip_buffer_push(&port->port); in digi_read_inb_callback()
1422 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_read_inb_callback()
1425 dev_dbg(&port->dev, "%s: got RECEIVE_DISABLE\n", __func__); in digi_read_inb_callback()
1427 dev_dbg(&port->dev, "%s: unknown opcode: %d\n", __func__, opcode); in digi_read_inb_callback()
1438 * When called we know port and port->private are not NULL and
1439 * the port->serial is valid. It returns 0 if successful, and
1440 * -1 if the sanity checks failed.
1446 struct usb_serial_port *port = urb->context; in digi_read_oob_callback()
1447 struct usb_serial *serial = port->serial; in digi_read_oob_callback()
1450 unsigned char *buf = urb->transfer_buffer; in digi_read_oob_callback()
1456 if (urb->actual_length < 4) in digi_read_oob_callback()
1457 return -1; in digi_read_oob_callback()
1460 for (i = 0; i < urb->actual_length - 3; i += 4) { in digi_read_oob_callback()
1466 dev_dbg(&port->dev, "digi_read_oob_callback: opcode=%d, line=%d, status=%d, val=%d\n", in digi_read_oob_callback()
1469 if (status != 0 || line >= serial->type->num_ports) in digi_read_oob_callback()
1472 port = serial->port[line]; in digi_read_oob_callback()
1476 return -1; in digi_read_oob_callback()
1478 tty = tty_port_tty_get(&port->port); in digi_read_oob_callback()
1487 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_read_oob_callback()
1490 priv->dp_modem_signals |= TIOCM_CTS; in digi_read_oob_callback()
1494 priv->dp_modem_signals &= ~TIOCM_CTS; in digi_read_oob_callback()
1498 priv->dp_modem_signals |= TIOCM_DSR; in digi_read_oob_callback()
1500 priv->dp_modem_signals &= ~TIOCM_DSR; in digi_read_oob_callback()
1502 priv->dp_modem_signals |= TIOCM_RI; in digi_read_oob_callback()
1504 priv->dp_modem_signals &= ~TIOCM_RI; in digi_read_oob_callback()
1506 priv->dp_modem_signals |= TIOCM_CD; in digi_read_oob_callback()
1508 priv->dp_modem_signals &= ~TIOCM_CD; in digi_read_oob_callback()
1510 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_read_oob_callback()
1513 tty_port_tty_wakeup(&port->port); in digi_read_oob_callback()
1515 spin_lock_irqsave(&priv->dp_port_lock, flags); in digi_read_oob_callback()
1516 priv->dp_transmit_idle = 1; in digi_read_oob_callback()
1517 wake_up_interruptible(&priv->dp_transmit_idle_wait); in digi_read_oob_callback()
1518 spin_unlock_irqrestore(&priv->dp_port_lock, flags); in digi_read_oob_callback()
1520 wake_up_interruptible(&priv->dp_flush_wait); in digi_read_oob_callback()