• Home
  • Raw
  • Download

Lines Matching +full:serial +full:- +full:state

1 // SPDX-License-Identifier: GPL-2.0+
3 * mxuport.c - MOXA UPort series driver
8 * Supports the following Moxa USB to serial converters:
11 * 8 ports : UPort 1610-8, UPort 1650-8
12 * 16 ports : UPort 1610-16, UPort 1650-16
19 #include <linux/serial.h>
27 #include <linux/usb/serial.h>
72 #define RQ_VENDOR_SET_HIGH_PERFOR 0x11 /* Set hi-performance */
90 #define RQ_VENDOR_GET_ROM_PROC 0x83 /* Get ROM process state */
105 /* Definitions for serial event type */
106 #define SERIAL_EV_CTS 0x0008 /* CTS changed state */
107 #define SERIAL_EV_DSR 0x0010 /* DSR changed state */
108 #define SERIAL_EV_RLSD 0x0020 /* RLSD changed state */
156 u8 mcr_state; /* Last MCR state */
157 u8 msr_state; /* Last MSR state */
198 count = kfifo_out_locked(&port->write_fifo, buf + HEADER_SIZE, in mxuport_prepare_write_buffer()
199 size - HEADER_SIZE, in mxuport_prepare_write_buffer()
200 &port->lock); in mxuport_prepare_write_buffer()
202 put_unaligned_be16(port->port_number, buf); in mxuport_prepare_write_buffer()
205 dev_dbg(&port->dev, "%s - size %zd count %d\n", __func__, in mxuport_prepare_write_buffer()
212 static int mxuport_recv_ctrl_urb(struct usb_serial *serial, in mxuport_recv_ctrl_urb() argument
218 status = usb_control_msg(serial->dev, in mxuport_recv_ctrl_urb()
219 usb_rcvctrlpipe(serial->dev, 0), in mxuport_recv_ctrl_urb()
226 dev_err(&serial->interface->dev, in mxuport_recv_ctrl_urb()
227 "%s - usb_control_msg failed (%d)\n", in mxuport_recv_ctrl_urb()
233 dev_err(&serial->interface->dev, in mxuport_recv_ctrl_urb()
234 "%s - short read (%d / %zd)\n", in mxuport_recv_ctrl_urb()
236 return -EIO; in mxuport_recv_ctrl_urb()
243 static int mxuport_send_ctrl_data_urb(struct usb_serial *serial, in mxuport_send_ctrl_data_urb() argument
250 status = usb_control_msg(serial->dev, in mxuport_send_ctrl_data_urb()
251 usb_sndctrlpipe(serial->dev, 0), in mxuport_send_ctrl_data_urb()
258 dev_err(&serial->interface->dev, in mxuport_send_ctrl_data_urb()
259 "%s - usb_control_msg failed (%d)\n", in mxuport_send_ctrl_data_urb()
265 dev_err(&serial->interface->dev, in mxuport_send_ctrl_data_urb()
266 "%s - short write (%d / %zd)\n", in mxuport_send_ctrl_data_urb()
268 return -EIO; in mxuport_send_ctrl_data_urb()
275 static int mxuport_send_ctrl_urb(struct usb_serial *serial, in mxuport_send_ctrl_urb() argument
278 return mxuport_send_ctrl_data_urb(serial, request, value, index, in mxuport_send_ctrl_urb()
283 * mxuport_throttle - throttle function of driver
288 * port->throttle. Instead tell the device to stop sending us data for
293 struct usb_serial_port *port = tty->driver_data; in mxuport_throttle()
294 struct usb_serial *serial = port->serial; in mxuport_throttle() local
296 dev_dbg(&port->dev, "%s\n", __func__); in mxuport_throttle()
298 mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, in mxuport_throttle()
299 0, port->port_number); in mxuport_throttle()
303 * mxuport_unthrottle - unthrottle function of driver
312 struct usb_serial_port *port = tty->driver_data; in mxuport_unthrottle()
313 struct usb_serial *serial = port->serial; in mxuport_unthrottle() local
315 dev_dbg(&port->dev, "%s\n", __func__); in mxuport_unthrottle()
317 mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, in mxuport_unthrottle()
318 1, port->port_number); in mxuport_unthrottle()
330 if (port->sysrq) { in mxuport_process_read_urb_data()
333 tty_insert_flip_char(&port->port, *data, in mxuport_process_read_urb_data()
337 tty_insert_flip_string(&port->port, data, size); in mxuport_process_read_urb_data()
339 tty_flip_buffer_push(&port->port); in mxuport_process_read_urb_data()
353 spin_lock_irqsave(&mxport->spinlock, flags); in mxuport_msr_event()
355 dev_dbg(&port->dev, "%s - current MSR status = 0x%x\n", in mxuport_msr_event()
356 __func__, mxport->msr_state); in mxuport_msr_event()
359 mxport->msr_state |= UART_MSR_CTS; in mxuport_msr_event()
360 dev_dbg(&port->dev, "%s - CTS high\n", __func__); in mxuport_msr_event()
362 mxport->msr_state &= ~UART_MSR_CTS; in mxuport_msr_event()
363 dev_dbg(&port->dev, "%s - CTS low\n", __func__); in mxuport_msr_event()
367 mxport->msr_state |= UART_MSR_DSR; in mxuport_msr_event()
368 dev_dbg(&port->dev, "%s - DSR high\n", __func__); in mxuport_msr_event()
370 mxport->msr_state &= ~UART_MSR_DSR; in mxuport_msr_event()
371 dev_dbg(&port->dev, "%s - DSR low\n", __func__); in mxuport_msr_event()
375 mxport->msr_state |= UART_MSR_DCD; in mxuport_msr_event()
376 dev_dbg(&port->dev, "%s - DCD high\n", __func__); in mxuport_msr_event()
378 mxport->msr_state &= ~UART_MSR_DCD; in mxuport_msr_event()
379 dev_dbg(&port->dev, "%s - DCD low\n", __func__); in mxuport_msr_event()
381 spin_unlock_irqrestore(&mxport->spinlock, flags); in mxuport_msr_event()
387 port->icount.cts++; in mxuport_msr_event()
388 dev_dbg(&port->dev, "%s - CTS change\n", __func__); in mxuport_msr_event()
392 port->icount.dsr++; in mxuport_msr_event()
393 dev_dbg(&port->dev, "%s - DSR change\n", __func__); in mxuport_msr_event()
397 port->icount.dcd++; in mxuport_msr_event()
398 dev_dbg(&port->dev, "%s - DCD change\n", __func__); in mxuport_msr_event()
400 wake_up_interruptible(&port->port.delta_msr_wait); in mxuport_msr_event()
409 port->icount.brk++; in mxuport_lsr_event()
410 dev_dbg(&port->dev, "%s - break error\n", __func__); in mxuport_lsr_event()
414 port->icount.frame++; in mxuport_lsr_event()
415 dev_dbg(&port->dev, "%s - frame error\n", __func__); in mxuport_lsr_event()
419 port->icount.parity++; in mxuport_lsr_event()
420 dev_dbg(&port->dev, "%s - parity error\n", __func__); in mxuport_lsr_event()
424 port->icount.overrun++; in mxuport_lsr_event()
425 dev_dbg(&port->dev, "%s - overrun error\n", __func__); in mxuport_lsr_event()
436 dev_dbg(&port->dev, "%s - receive event : %04x\n", __func__, event); in mxuport_process_read_urb_event()
461 dev_dbg(&port->dev, "Unexpected event\n"); in mxuport_process_read_urb_event()
472 struct usb_serial_port *port = urb->context; in mxuport_process_read_urb_demux_data()
473 struct usb_serial *serial = port->serial; in mxuport_process_read_urb_demux_data() local
474 u8 *data = urb->transfer_buffer; in mxuport_process_read_urb_demux_data()
475 u8 *end = data + urb->actual_length; in mxuport_process_read_urb_demux_data()
483 dev_warn(&port->dev, "%s - message with short header\n", in mxuport_process_read_urb_demux_data()
489 if (rcv_port >= serial->num_ports) { in mxuport_process_read_urb_demux_data()
490 dev_warn(&port->dev, "%s - message for invalid port\n", in mxuport_process_read_urb_demux_data()
495 demux_port = serial->port[rcv_port]; in mxuport_process_read_urb_demux_data()
498 dev_warn(&port->dev, "%s - short data\n", __func__); in mxuport_process_read_urb_demux_data()
502 if (tty_port_initialized(&demux_port->port)) { in mxuport_process_read_urb_demux_data()
506 dev_dbg(&demux_port->dev, "%s - data for closed port\n", in mxuport_process_read_urb_demux_data()
519 struct usb_serial_port *port = urb->context; in mxuport_process_read_urb_demux_event()
520 struct usb_serial *serial = port->serial; in mxuport_process_read_urb_demux_event() local
521 u8 *data = urb->transfer_buffer; in mxuport_process_read_urb_demux_event()
522 u8 *end = data + urb->actual_length; in mxuport_process_read_urb_demux_event()
530 dev_warn(&port->dev, "%s - message with short event\n", in mxuport_process_read_urb_demux_event()
536 if (rcv_port >= serial->num_ports) { in mxuport_process_read_urb_demux_event()
537 dev_warn(&port->dev, "%s - message for invalid port\n", in mxuport_process_read_urb_demux_event()
542 demux_port = serial->port[rcv_port]; in mxuport_process_read_urb_demux_event()
543 if (tty_port_initialized(&demux_port->port)) { in mxuport_process_read_urb_demux_event()
549 dev_dbg(&demux_port->dev, in mxuport_process_read_urb_demux_event()
550 "%s - event for closed port\n", __func__); in mxuport_process_read_urb_demux_event()
559 * contain serial data or events.
563 struct usb_serial_port *port = urb->context; in mxuport_process_read_urb()
564 struct usb_serial *serial = port->serial; in mxuport_process_read_urb() local
566 if (port == serial->port[0]) in mxuport_process_read_urb()
569 if (port == serial->port[1]) in mxuport_process_read_urb()
579 struct usb_serial *serial = port->serial; in mxuport_tx_empty() local
589 err = mxuport_recv_ctrl_urb(serial, RQ_VENDOR_GET_OUTQUEUE, 0, in mxuport_tx_empty()
590 port->port_number, len_buf, 4); in mxuport_tx_empty()
595 dev_dbg(&port->dev, "%s - tx len = %u\n", __func__, txlen); in mxuport_tx_empty()
607 struct usb_serial *serial = port->serial; in mxuport_set_mcr() local
610 dev_dbg(&port->dev, "%s - %02x\n", __func__, mcr_state); in mxuport_set_mcr()
612 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_MCR, in mxuport_set_mcr()
613 mcr_state, port->port_number); in mxuport_set_mcr()
615 dev_err(&port->dev, "%s - failed to change MCR\n", __func__); in mxuport_set_mcr()
623 struct usb_serial *serial = port->serial; in mxuport_set_dtr() local
626 mutex_lock(&mxport->mutex); in mxuport_set_dtr()
628 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_DTR, in mxuport_set_dtr()
629 !!on, port->port_number); in mxuport_set_dtr()
632 mxport->mcr_state |= UART_MCR_DTR; in mxuport_set_dtr()
634 mxport->mcr_state &= ~UART_MCR_DTR; in mxuport_set_dtr()
637 mutex_unlock(&mxport->mutex); in mxuport_set_dtr()
642 static int mxuport_set_rts(struct usb_serial_port *port, u8 state) in mxuport_set_rts() argument
645 struct usb_serial *serial = port->serial; in mxuport_set_rts() local
649 mutex_lock(&mxport->mutex); in mxuport_set_rts()
650 mcr_state = mxport->mcr_state; in mxuport_set_rts()
652 switch (state) { in mxuport_set_rts()
661 * Do not update mxport->mcr_state when doing hardware in mxuport_set_rts()
670 err = -EINVAL; in mxuport_set_rts()
673 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RTS, in mxuport_set_rts()
674 state, port->port_number); in mxuport_set_rts()
676 mxport->mcr_state = mcr_state; in mxuport_set_rts()
679 mutex_unlock(&mxport->mutex); in mxuport_set_rts()
690 mutex_lock(&mxport->mutex); in mxuport_dtr_rts()
691 mcr_state = mxport->mcr_state; in mxuport_dtr_rts()
700 mxport->mcr_state = mcr_state; in mxuport_dtr_rts()
702 mutex_unlock(&mxport->mutex); in mxuport_dtr_rts()
708 struct usb_serial_port *port = tty->driver_data; in mxuport_tiocmset()
713 mutex_lock(&mxport->mutex); in mxuport_tiocmset()
714 mcr_state = mxport->mcr_state; in mxuport_tiocmset()
730 mxport->mcr_state = mcr_state; in mxuport_tiocmset()
732 mutex_unlock(&mxport->mutex); in mxuport_tiocmset()
740 struct usb_serial_port *port = tty->driver_data; in mxuport_tiocmget()
748 mutex_lock(&mxport->mutex); in mxuport_tiocmget()
749 spin_lock_irqsave(&mxport->spinlock, flags); in mxuport_tiocmget()
751 msr = mxport->msr_state; in mxuport_tiocmget()
752 mcr = mxport->mcr_state; in mxuport_tiocmget()
754 spin_unlock_irqrestore(&mxport->spinlock, flags); in mxuport_tiocmget()
755 mutex_unlock(&mxport->mutex); in mxuport_tiocmget()
764 dev_dbg(&port->dev, "%s - 0x%04x\n", __func__, result); in mxuport_tiocmget()
772 struct usb_serial *serial) in mxuport_set_termios_flow() argument
783 return -ENOMEM; in mxuport_set_termios_flow()
791 err = mxuport_send_ctrl_data_urb(serial, RQ_VENDOR_SET_CHARS, in mxuport_set_termios_flow()
792 0, port->port_number, in mxuport_set_termios_flow()
797 dev_dbg(&port->dev, "%s - XON = 0x%02x, XOFF = 0x%02x\n", in mxuport_set_termios_flow()
803 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_XONXOFF, in mxuport_set_termios_flow()
804 enable, port->port_number); in mxuport_set_termios_flow()
812 C_CRTSCTS(tty) != (old_termios->c_cflag & CRTSCTS)) { in mxuport_set_termios_flow()
820 if (old_termios && (old_termios->c_cflag & CBAUD) == B0) { in mxuport_set_termios_flow()
846 struct usb_serial *serial = port->serial; in mxuport_set_termios() local
855 !tty_termios_hw_change(&tty->termios, old_termios) && in mxuport_set_termios()
856 tty->termios.c_iflag == old_termios->c_iflag) { in mxuport_set_termios()
857 dev_dbg(&port->dev, "%s - nothing to change\n", __func__); in mxuport_set_termios()
910 err = mxuport_send_ctrl_data_urb(serial, RQ_VENDOR_SET_LINE, in mxuport_set_termios()
911 0, port->port_number, buf, 4); in mxuport_set_termios()
915 err = mxuport_set_termios_flow(tty, old_termios, port, serial); in mxuport_set_termios()
926 err = mxuport_send_ctrl_data_urb(serial, RQ_VENDOR_SET_BAUD, in mxuport_set_termios()
927 0, port->port_number, in mxuport_set_termios()
932 dev_dbg(&port->dev, "baud_rate : %d\n", baud); in mxuport_set_termios()
933 dev_dbg(&port->dev, "data_bits : %d\n", data_bits); in mxuport_set_termios()
934 dev_dbg(&port->dev, "parity : %d\n", parity); in mxuport_set_termios()
935 dev_dbg(&port->dev, "stop_bits : %d\n", stop_bits); in mxuport_set_termios()
945 static int mxuport_calc_num_ports(struct usb_serial *serial, in mxuport_calc_num_ports() argument
948 unsigned long features = (unsigned long)usb_get_serial_data(serial); in mxuport_calc_num_ports()
961 dev_warn(&serial->interface->dev, in mxuport_calc_num_ports()
967 * Setup bulk-out endpoint multiplexing. All ports share the same in mxuport_calc_num_ports()
968 * bulk-out endpoint. in mxuport_calc_num_ports()
970 BUILD_BUG_ON(ARRAY_SIZE(epds->bulk_out) < 16); in mxuport_calc_num_ports()
973 epds->bulk_out[i] = epds->bulk_out[0]; in mxuport_calc_num_ports()
975 epds->num_bulk_out = num_ports; in mxuport_calc_num_ports()
981 static int mxuport_get_fw_version(struct usb_serial *serial, u32 *version) in mxuport_get_fw_version() argument
988 return -ENOMEM; in mxuport_get_fw_version()
991 err = mxuport_recv_ctrl_urb(serial, RQ_VENDOR_GET_VERSION, 0, 0, in mxuport_get_fw_version()
994 err = -EIO; in mxuport_get_fw_version()
1006 static int mxuport_download_fw(struct usb_serial *serial, in mxuport_download_fw() argument
1016 return -ENOMEM; in mxuport_download_fw()
1018 dev_dbg(&serial->interface->dev, "Starting firmware download...\n"); in mxuport_download_fw()
1019 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_START_FW_DOWN, 0, 0); in mxuport_download_fw()
1025 txlen = min_t(size_t, (fw_p->size - fwidx), DOWN_BLOCK_SIZE); in mxuport_download_fw()
1027 memcpy(fw_buf, &fw_p->data[fwidx], txlen); in mxuport_download_fw()
1028 err = mxuport_send_ctrl_data_urb(serial, RQ_VENDOR_FW_DATA, in mxuport_download_fw()
1031 mxuport_send_ctrl_urb(serial, RQ_VENDOR_STOP_FW_DOWN, in mxuport_download_fw()
1039 } while (fwidx < fw_p->size); in mxuport_download_fw()
1042 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_STOP_FW_DOWN, 0, 0); in mxuport_download_fw()
1047 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_QUERY_FW_READY, 0, 0); in mxuport_download_fw()
1054 static int mxuport_probe(struct usb_serial *serial, in mxuport_probe() argument
1057 u16 productid = le16_to_cpu(serial->dev->descriptor.idProduct); in mxuport_probe()
1065 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_QUERY_FW_CONFIG, 0, 0); in mxuport_probe()
1067 mxuport_send_ctrl_urb(serial, RQ_VENDOR_RESET_DEVICE, 0, 0); in mxuport_probe()
1071 err = mxuport_get_fw_version(serial, &version); in mxuport_probe()
1075 dev_dbg(&serial->interface->dev, "Device firmware version v%x.%x.%x\n", in mxuport_probe()
1080 snprintf(buf, sizeof(buf) - 1, "moxa/moxa-%04x.fw", productid); in mxuport_probe()
1082 err = request_firmware(&fw_p, buf, &serial->interface->dev); in mxuport_probe()
1084 dev_warn(&serial->interface->dev, "Firmware %s not found\n", in mxuport_probe()
1090 local_ver = ((fw_p->data[VER_ADDR_1] << 16) | in mxuport_probe()
1091 (fw_p->data[VER_ADDR_2] << 8) | in mxuport_probe()
1092 fw_p->data[VER_ADDR_3]); in mxuport_probe()
1093 dev_dbg(&serial->interface->dev, in mxuport_probe()
1095 fw_p->data[VER_ADDR_1], fw_p->data[VER_ADDR_2], in mxuport_probe()
1096 fw_p->data[VER_ADDR_3]); in mxuport_probe()
1098 err = mxuport_download_fw(serial, fw_p); in mxuport_probe()
1101 err = mxuport_get_fw_version(serial, &version); in mxuport_probe()
1107 dev_info(&serial->interface->dev, in mxuport_probe()
1117 usb_set_serial_data(serial, (void *)id->driver_info); in mxuport_probe()
1127 struct usb_serial *serial = port->serial; in mxuport_port_probe() local
1131 mxport = devm_kzalloc(&port->dev, sizeof(struct mxuport_port), in mxuport_port_probe()
1134 return -ENOMEM; in mxuport_port_probe()
1136 mutex_init(&mxport->mutex); in mxuport_port_probe()
1137 spin_lock_init(&mxport->spinlock); in mxuport_port_probe()
1143 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_FIFO_DISABLE, in mxuport_port_probe()
1144 0, port->port_number); in mxuport_port_probe()
1148 /* Set transmission mode (Hi-Performance) */ in mxuport_port_probe()
1149 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_HIGH_PERFOR, in mxuport_port_probe()
1150 0, port->port_number); in mxuport_port_probe()
1154 /* Set interface (RS-232) */ in mxuport_port_probe()
1155 return mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_INTERFACE, in mxuport_port_probe()
1157 port->port_number); in mxuport_port_probe()
1160 static int mxuport_attach(struct usb_serial *serial) in mxuport_attach() argument
1162 struct usb_serial_port *port0 = serial->port[0]; in mxuport_attach()
1163 struct usb_serial_port *port1 = serial->port[1]; in mxuport_attach()
1186 static void mxuport_release(struct usb_serial *serial) in mxuport_release() argument
1188 struct usb_serial_port *port0 = serial->port[0]; in mxuport_release()
1189 struct usb_serial_port *port1 = serial->port[1]; in mxuport_release()
1198 struct usb_serial *serial = port->serial; in mxuport_open() local
1202 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, in mxuport_open()
1203 1, port->port_number); in mxuport_open()
1207 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_OPEN, in mxuport_open()
1208 1, port->port_number); in mxuport_open()
1210 mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, in mxuport_open()
1211 0, port->port_number); in mxuport_open()
1223 mxport->msr_state = 0; in mxuport_open()
1230 struct usb_serial *serial = port->serial; in mxuport_close() local
1232 mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_OPEN, 0, in mxuport_close()
1233 port->port_number); in mxuport_close()
1235 mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, 0, in mxuport_close()
1236 port->port_number); in mxuport_close()
1242 struct usb_serial_port *port = tty->driver_data; in mxuport_break_ctl()
1243 struct usb_serial *serial = port->serial; in mxuport_break_ctl() local
1246 if (break_state == -1) { in mxuport_break_ctl()
1248 dev_dbg(&port->dev, "%s - sending break\n", __func__); in mxuport_break_ctl()
1251 dev_dbg(&port->dev, "%s - clearing break\n", __func__); in mxuport_break_ctl()
1254 mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_BREAK, in mxuport_break_ctl()
1255 enable, port->port_number); in mxuport_break_ctl()
1258 static int mxuport_resume(struct usb_serial *serial) in mxuport_resume() argument
1266 port = serial->port[i]; in mxuport_resume()
1273 for (i = 0; i < serial->num_ports; i++) { in mxuport_resume()
1274 port = serial->port[i]; in mxuport_resume()
1275 if (!tty_port_initialized(&port->port)) in mxuport_resume()
1283 return c ? -EIO : 0; in mxuport_resume()