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()
268 static int mxuport_send_ctrl_urb(struct usb_serial *serial, in mxuport_send_ctrl_urb() argument
271 return mxuport_send_ctrl_data_urb(serial, request, value, index, in mxuport_send_ctrl_urb()
276 * mxuport_throttle - throttle function of driver
281 * port->throttle. Instead tell the device to stop sending us data for
286 struct usb_serial_port *port = tty->driver_data; in mxuport_throttle()
287 struct usb_serial *serial = port->serial; in mxuport_throttle() local
289 dev_dbg(&port->dev, "%s\n", __func__); in mxuport_throttle()
291 mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, in mxuport_throttle()
292 0, port->port_number); in mxuport_throttle()
296 * mxuport_unthrottle - unthrottle function of driver
305 struct usb_serial_port *port = tty->driver_data; in mxuport_unthrottle()
306 struct usb_serial *serial = port->serial; in mxuport_unthrottle() local
308 dev_dbg(&port->dev, "%s\n", __func__); in mxuport_unthrottle()
310 mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, in mxuport_unthrottle()
311 1, port->port_number); in mxuport_unthrottle()
323 if (port->sysrq) { in mxuport_process_read_urb_data()
326 tty_insert_flip_char(&port->port, *data, in mxuport_process_read_urb_data()
330 tty_insert_flip_string(&port->port, data, size); in mxuport_process_read_urb_data()
332 tty_flip_buffer_push(&port->port); in mxuport_process_read_urb_data()
346 spin_lock_irqsave(&mxport->spinlock, flags); in mxuport_msr_event()
348 dev_dbg(&port->dev, "%s - current MSR status = 0x%x\n", in mxuport_msr_event()
349 __func__, mxport->msr_state); in mxuport_msr_event()
352 mxport->msr_state |= UART_MSR_CTS; in mxuport_msr_event()
353 dev_dbg(&port->dev, "%s - CTS high\n", __func__); in mxuport_msr_event()
355 mxport->msr_state &= ~UART_MSR_CTS; in mxuport_msr_event()
356 dev_dbg(&port->dev, "%s - CTS low\n", __func__); in mxuport_msr_event()
360 mxport->msr_state |= UART_MSR_DSR; in mxuport_msr_event()
361 dev_dbg(&port->dev, "%s - DSR high\n", __func__); in mxuport_msr_event()
363 mxport->msr_state &= ~UART_MSR_DSR; in mxuport_msr_event()
364 dev_dbg(&port->dev, "%s - DSR low\n", __func__); in mxuport_msr_event()
368 mxport->msr_state |= UART_MSR_DCD; in mxuport_msr_event()
369 dev_dbg(&port->dev, "%s - DCD high\n", __func__); in mxuport_msr_event()
371 mxport->msr_state &= ~UART_MSR_DCD; in mxuport_msr_event()
372 dev_dbg(&port->dev, "%s - DCD low\n", __func__); in mxuport_msr_event()
374 spin_unlock_irqrestore(&mxport->spinlock, flags); in mxuport_msr_event()
380 port->icount.cts++; in mxuport_msr_event()
381 dev_dbg(&port->dev, "%s - CTS change\n", __func__); in mxuport_msr_event()
385 port->icount.dsr++; in mxuport_msr_event()
386 dev_dbg(&port->dev, "%s - DSR change\n", __func__); in mxuport_msr_event()
390 port->icount.dcd++; in mxuport_msr_event()
391 dev_dbg(&port->dev, "%s - DCD change\n", __func__); in mxuport_msr_event()
393 wake_up_interruptible(&port->port.delta_msr_wait); in mxuport_msr_event()
402 port->icount.brk++; in mxuport_lsr_event()
403 dev_dbg(&port->dev, "%s - break error\n", __func__); in mxuport_lsr_event()
407 port->icount.frame++; in mxuport_lsr_event()
408 dev_dbg(&port->dev, "%s - frame error\n", __func__); in mxuport_lsr_event()
412 port->icount.parity++; in mxuport_lsr_event()
413 dev_dbg(&port->dev, "%s - parity error\n", __func__); in mxuport_lsr_event()
417 port->icount.overrun++; in mxuport_lsr_event()
418 dev_dbg(&port->dev, "%s - overrun error\n", __func__); in mxuport_lsr_event()
429 dev_dbg(&port->dev, "%s - receive event : %04x\n", __func__, event); in mxuport_process_read_urb_event()
454 dev_dbg(&port->dev, "Unexpected event\n"); in mxuport_process_read_urb_event()
465 struct usb_serial_port *port = urb->context; in mxuport_process_read_urb_demux_data()
466 struct usb_serial *serial = port->serial; in mxuport_process_read_urb_demux_data() local
467 u8 *data = urb->transfer_buffer; in mxuport_process_read_urb_demux_data()
468 u8 *end = data + urb->actual_length; in mxuport_process_read_urb_demux_data()
476 dev_warn(&port->dev, "%s - message with short header\n", in mxuport_process_read_urb_demux_data()
482 if (rcv_port >= serial->num_ports) { in mxuport_process_read_urb_demux_data()
483 dev_warn(&port->dev, "%s - message for invalid port\n", in mxuport_process_read_urb_demux_data()
488 demux_port = serial->port[rcv_port]; in mxuport_process_read_urb_demux_data()
491 dev_warn(&port->dev, "%s - short data\n", __func__); in mxuport_process_read_urb_demux_data()
495 if (tty_port_initialized(&demux_port->port)) { in mxuport_process_read_urb_demux_data()
499 dev_dbg(&demux_port->dev, "%s - data for closed port\n", in mxuport_process_read_urb_demux_data()
512 struct usb_serial_port *port = urb->context; in mxuport_process_read_urb_demux_event()
513 struct usb_serial *serial = port->serial; in mxuport_process_read_urb_demux_event() local
514 u8 *data = urb->transfer_buffer; in mxuport_process_read_urb_demux_event()
515 u8 *end = data + urb->actual_length; in mxuport_process_read_urb_demux_event()
523 dev_warn(&port->dev, "%s - message with short event\n", in mxuport_process_read_urb_demux_event()
529 if (rcv_port >= serial->num_ports) { in mxuport_process_read_urb_demux_event()
530 dev_warn(&port->dev, "%s - message for invalid port\n", in mxuport_process_read_urb_demux_event()
535 demux_port = serial->port[rcv_port]; in mxuport_process_read_urb_demux_event()
536 if (tty_port_initialized(&demux_port->port)) { in mxuport_process_read_urb_demux_event()
542 dev_dbg(&demux_port->dev, in mxuport_process_read_urb_demux_event()
543 "%s - event for closed port\n", __func__); in mxuport_process_read_urb_demux_event()
552 * contain serial data or events.
556 struct usb_serial_port *port = urb->context; in mxuport_process_read_urb()
557 struct usb_serial *serial = port->serial; in mxuport_process_read_urb() local
559 if (port == serial->port[0]) in mxuport_process_read_urb()
562 if (port == serial->port[1]) in mxuport_process_read_urb()
572 struct usb_serial *serial = port->serial; in mxuport_tx_empty() local
582 err = mxuport_recv_ctrl_urb(serial, RQ_VENDOR_GET_OUTQUEUE, 0, in mxuport_tx_empty()
583 port->port_number, len_buf, 4); in mxuport_tx_empty()
588 dev_dbg(&port->dev, "%s - tx len = %u\n", __func__, txlen); in mxuport_tx_empty()
600 struct usb_serial *serial = port->serial; in mxuport_set_mcr() local
603 dev_dbg(&port->dev, "%s - %02x\n", __func__, mcr_state); in mxuport_set_mcr()
605 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_MCR, in mxuport_set_mcr()
606 mcr_state, port->port_number); in mxuport_set_mcr()
608 dev_err(&port->dev, "%s - failed to change MCR\n", __func__); in mxuport_set_mcr()
616 struct usb_serial *serial = port->serial; in mxuport_set_dtr() local
619 mutex_lock(&mxport->mutex); in mxuport_set_dtr()
621 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_DTR, in mxuport_set_dtr()
622 !!on, port->port_number); in mxuport_set_dtr()
625 mxport->mcr_state |= UART_MCR_DTR; in mxuport_set_dtr()
627 mxport->mcr_state &= ~UART_MCR_DTR; in mxuport_set_dtr()
630 mutex_unlock(&mxport->mutex); in mxuport_set_dtr()
635 static int mxuport_set_rts(struct usb_serial_port *port, u8 state) in mxuport_set_rts() argument
638 struct usb_serial *serial = port->serial; in mxuport_set_rts() local
642 mutex_lock(&mxport->mutex); in mxuport_set_rts()
643 mcr_state = mxport->mcr_state; in mxuport_set_rts()
645 switch (state) { in mxuport_set_rts()
654 * Do not update mxport->mcr_state when doing hardware in mxuport_set_rts()
663 err = -EINVAL; in mxuport_set_rts()
666 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RTS, in mxuport_set_rts()
667 state, port->port_number); in mxuport_set_rts()
669 mxport->mcr_state = mcr_state; in mxuport_set_rts()
672 mutex_unlock(&mxport->mutex); in mxuport_set_rts()
683 mutex_lock(&mxport->mutex); in mxuport_dtr_rts()
684 mcr_state = mxport->mcr_state; in mxuport_dtr_rts()
693 mxport->mcr_state = mcr_state; in mxuport_dtr_rts()
695 mutex_unlock(&mxport->mutex); in mxuport_dtr_rts()
701 struct usb_serial_port *port = tty->driver_data; in mxuport_tiocmset()
706 mutex_lock(&mxport->mutex); in mxuport_tiocmset()
707 mcr_state = mxport->mcr_state; in mxuport_tiocmset()
723 mxport->mcr_state = mcr_state; in mxuport_tiocmset()
725 mutex_unlock(&mxport->mutex); in mxuport_tiocmset()
733 struct usb_serial_port *port = tty->driver_data; in mxuport_tiocmget()
741 mutex_lock(&mxport->mutex); in mxuport_tiocmget()
742 spin_lock_irqsave(&mxport->spinlock, flags); in mxuport_tiocmget()
744 msr = mxport->msr_state; in mxuport_tiocmget()
745 mcr = mxport->mcr_state; in mxuport_tiocmget()
747 spin_unlock_irqrestore(&mxport->spinlock, flags); in mxuport_tiocmget()
748 mutex_unlock(&mxport->mutex); in mxuport_tiocmget()
757 dev_dbg(&port->dev, "%s - 0x%04x\n", __func__, result); in mxuport_tiocmget()
765 struct usb_serial *serial) in mxuport_set_termios_flow() argument
776 return -ENOMEM; in mxuport_set_termios_flow()
784 err = mxuport_send_ctrl_data_urb(serial, RQ_VENDOR_SET_CHARS, in mxuport_set_termios_flow()
785 0, port->port_number, in mxuport_set_termios_flow()
790 dev_dbg(&port->dev, "%s - XON = 0x%02x, XOFF = 0x%02x\n", in mxuport_set_termios_flow()
796 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_XONXOFF, in mxuport_set_termios_flow()
797 enable, port->port_number); in mxuport_set_termios_flow()
805 C_CRTSCTS(tty) != (old_termios->c_cflag & CRTSCTS)) { in mxuport_set_termios_flow()
813 if (old_termios && (old_termios->c_cflag & CBAUD) == B0) { in mxuport_set_termios_flow()
839 struct usb_serial *serial = port->serial; in mxuport_set_termios() local
848 !tty_termios_hw_change(&tty->termios, old_termios) && in mxuport_set_termios()
849 tty->termios.c_iflag == old_termios->c_iflag) { in mxuport_set_termios()
850 dev_dbg(&port->dev, "%s - nothing to change\n", __func__); in mxuport_set_termios()
903 err = mxuport_send_ctrl_data_urb(serial, RQ_VENDOR_SET_LINE, in mxuport_set_termios()
904 0, port->port_number, buf, 4); in mxuport_set_termios()
908 err = mxuport_set_termios_flow(tty, old_termios, port, serial); in mxuport_set_termios()
919 err = mxuport_send_ctrl_data_urb(serial, RQ_VENDOR_SET_BAUD, in mxuport_set_termios()
920 0, port->port_number, in mxuport_set_termios()
925 dev_dbg(&port->dev, "baud_rate : %d\n", baud); in mxuport_set_termios()
926 dev_dbg(&port->dev, "data_bits : %d\n", data_bits); in mxuport_set_termios()
927 dev_dbg(&port->dev, "parity : %d\n", parity); in mxuport_set_termios()
928 dev_dbg(&port->dev, "stop_bits : %d\n", stop_bits); in mxuport_set_termios()
938 static int mxuport_calc_num_ports(struct usb_serial *serial, in mxuport_calc_num_ports() argument
941 unsigned long features = (unsigned long)usb_get_serial_data(serial); in mxuport_calc_num_ports()
954 dev_warn(&serial->interface->dev, in mxuport_calc_num_ports()
960 * Setup bulk-out endpoint multiplexing. All ports share the same in mxuport_calc_num_ports()
961 * bulk-out endpoint. in mxuport_calc_num_ports()
963 BUILD_BUG_ON(ARRAY_SIZE(epds->bulk_out) < 16); in mxuport_calc_num_ports()
966 epds->bulk_out[i] = epds->bulk_out[0]; in mxuport_calc_num_ports()
968 epds->num_bulk_out = num_ports; in mxuport_calc_num_ports()
974 static int mxuport_get_fw_version(struct usb_serial *serial, u32 *version) in mxuport_get_fw_version() argument
981 return -ENOMEM; in mxuport_get_fw_version()
984 err = mxuport_recv_ctrl_urb(serial, RQ_VENDOR_GET_VERSION, 0, 0, in mxuport_get_fw_version()
987 err = -EIO; in mxuport_get_fw_version()
999 static int mxuport_download_fw(struct usb_serial *serial, in mxuport_download_fw() argument
1009 return -ENOMEM; in mxuport_download_fw()
1011 dev_dbg(&serial->interface->dev, "Starting firmware download...\n"); in mxuport_download_fw()
1012 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_START_FW_DOWN, 0, 0); in mxuport_download_fw()
1018 txlen = min_t(size_t, (fw_p->size - fwidx), DOWN_BLOCK_SIZE); in mxuport_download_fw()
1020 memcpy(fw_buf, &fw_p->data[fwidx], txlen); in mxuport_download_fw()
1021 err = mxuport_send_ctrl_data_urb(serial, RQ_VENDOR_FW_DATA, in mxuport_download_fw()
1024 mxuport_send_ctrl_urb(serial, RQ_VENDOR_STOP_FW_DOWN, in mxuport_download_fw()
1032 } while (fwidx < fw_p->size); in mxuport_download_fw()
1035 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_STOP_FW_DOWN, 0, 0); in mxuport_download_fw()
1040 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_QUERY_FW_READY, 0, 0); in mxuport_download_fw()
1047 static int mxuport_probe(struct usb_serial *serial, in mxuport_probe() argument
1050 u16 productid = le16_to_cpu(serial->dev->descriptor.idProduct); in mxuport_probe()
1058 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_QUERY_FW_CONFIG, 0, 0); in mxuport_probe()
1060 mxuport_send_ctrl_urb(serial, RQ_VENDOR_RESET_DEVICE, 0, 0); in mxuport_probe()
1064 err = mxuport_get_fw_version(serial, &version); in mxuport_probe()
1068 dev_dbg(&serial->interface->dev, "Device firmware version v%x.%x.%x\n", in mxuport_probe()
1073 snprintf(buf, sizeof(buf) - 1, "moxa/moxa-%04x.fw", productid); in mxuport_probe()
1075 err = request_firmware(&fw_p, buf, &serial->interface->dev); in mxuport_probe()
1077 dev_warn(&serial->interface->dev, "Firmware %s not found\n", in mxuport_probe()
1083 local_ver = ((fw_p->data[VER_ADDR_1] << 16) | in mxuport_probe()
1084 (fw_p->data[VER_ADDR_2] << 8) | in mxuport_probe()
1085 fw_p->data[VER_ADDR_3]); in mxuport_probe()
1086 dev_dbg(&serial->interface->dev, in mxuport_probe()
1088 fw_p->data[VER_ADDR_1], fw_p->data[VER_ADDR_2], in mxuport_probe()
1089 fw_p->data[VER_ADDR_3]); in mxuport_probe()
1091 err = mxuport_download_fw(serial, fw_p); in mxuport_probe()
1094 err = mxuport_get_fw_version(serial, &version); in mxuport_probe()
1100 dev_info(&serial->interface->dev, in mxuport_probe()
1110 usb_set_serial_data(serial, (void *)id->driver_info); in mxuport_probe()
1120 struct usb_serial *serial = port->serial; in mxuport_port_probe() local
1124 mxport = devm_kzalloc(&port->dev, sizeof(struct mxuport_port), in mxuport_port_probe()
1127 return -ENOMEM; in mxuport_port_probe()
1129 mutex_init(&mxport->mutex); in mxuport_port_probe()
1130 spin_lock_init(&mxport->spinlock); in mxuport_port_probe()
1136 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_FIFO_DISABLE, in mxuport_port_probe()
1137 0, port->port_number); in mxuport_port_probe()
1141 /* Set transmission mode (Hi-Performance) */ in mxuport_port_probe()
1142 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_HIGH_PERFOR, in mxuport_port_probe()
1143 0, port->port_number); in mxuport_port_probe()
1147 /* Set interface (RS-232) */ in mxuport_port_probe()
1148 return mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_INTERFACE, in mxuport_port_probe()
1150 port->port_number); in mxuport_port_probe()
1153 static int mxuport_attach(struct usb_serial *serial) in mxuport_attach() argument
1155 struct usb_serial_port *port0 = serial->port[0]; in mxuport_attach()
1156 struct usb_serial_port *port1 = serial->port[1]; in mxuport_attach()
1179 static void mxuport_release(struct usb_serial *serial) in mxuport_release() argument
1181 struct usb_serial_port *port0 = serial->port[0]; in mxuport_release()
1182 struct usb_serial_port *port1 = serial->port[1]; in mxuport_release()
1191 struct usb_serial *serial = port->serial; in mxuport_open() local
1195 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, in mxuport_open()
1196 1, port->port_number); in mxuport_open()
1200 err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_OPEN, in mxuport_open()
1201 1, port->port_number); in mxuport_open()
1203 mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, in mxuport_open()
1204 0, port->port_number); in mxuport_open()
1216 mxport->msr_state = 0; in mxuport_open()
1223 struct usb_serial *serial = port->serial; in mxuport_close() local
1225 mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_OPEN, 0, in mxuport_close()
1226 port->port_number); in mxuport_close()
1228 mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, 0, in mxuport_close()
1229 port->port_number); in mxuport_close()
1235 struct usb_serial_port *port = tty->driver_data; in mxuport_break_ctl()
1236 struct usb_serial *serial = port->serial; in mxuport_break_ctl() local
1239 if (break_state == -1) { in mxuport_break_ctl()
1241 dev_dbg(&port->dev, "%s - sending break\n", __func__); in mxuport_break_ctl()
1244 dev_dbg(&port->dev, "%s - clearing break\n", __func__); in mxuport_break_ctl()
1247 return mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_BREAK, in mxuport_break_ctl()
1248 enable, port->port_number); in mxuport_break_ctl()
1251 static int mxuport_resume(struct usb_serial *serial) in mxuport_resume() argument
1259 port = serial->port[i]; in mxuport_resume()
1266 for (i = 0; i < serial->num_ports; i++) { in mxuport_resume()
1267 port = serial->port[i]; in mxuport_resume()
1268 if (!tty_port_initialized(&port->port)) in mxuport_resume()
1276 return c ? -EIO : 0; in mxuport_resume()
1317 MODULE_DESCRIPTION("Moxa UPORT USB Serial driver");