Lines Matching +full:modem +full:- +full:control +full:- +full:line +full:- +full:ports

1 // SPDX-License-Identifier: GPL-2.0+
3 * mxuport.c - MOXA UPort series driver
9 * 2 ports : UPort 1250, UPort 1250I
10 * 4 ports : UPort 1410, UPort 1450, UPort 1450I
11 * 8 ports : UPort 1610-8, UPort 1650-8
12 * 16 ports : UPort 1610-16, UPort 1650-16
55 #define RQ_VENDOR_SET_LINE 0x02 /* Set line status */
72 #define RQ_VENDOR_SET_HIGH_PERFOR 0x11 /* Set hi-performance */
95 #define RQ_VENDOR_GET_MSR 0x86 /* Get modem status register */
101 #define UPORT_EVENT_MSR 3 /* Modem status */
102 #define UPORT_EVENT_LSR 4 /* Line status */
103 #define UPORT_EVENT_MCR 5 /* Modem control */
110 /* Definitions for modem control event type */
113 /* Definitions for line control of communication */
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()
211 /* Read the given buffer in from the control pipe. */
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()
242 /* Write the given buffer out to the control pipe. */
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()
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()
289 dev_dbg(&port->dev, "%s\n", __func__); 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()
308 dev_dbg(&port->dev, "%s\n", __func__); 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()
423 * When something interesting happens, modem control lines XON/XOFF
429 dev_dbg(&port->dev, "%s - receive event : %04x\n", __func__, event); in mxuport_process_read_urb_event()
434 * Sent as part of the flow control on device buffers. in mxuport_process_read_urb_event()
449 * needed. This event could be used for flow control in mxuport_process_read_urb_event()
454 dev_dbg(&port->dev, "Unexpected event\n"); in mxuport_process_read_urb_event()
460 * One URB can contain data for multiple ports. Demultiplex the data,
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()
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()
507 * One URB can contain events for multiple ports. Demultiplex the event,
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()
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()
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()
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()
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()
603 dev_dbg(&port->dev, "%s - %02x\n", __func__, mcr_state); 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()
619 mutex_lock(&mxport->mutex); 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()
638 struct usb_serial *serial = port->serial; in mxuport_set_rts()
642 mutex_lock(&mxport->mutex); in mxuport_set_rts()
643 mcr_state = mxport->mcr_state; in mxuport_set_rts()
654 * Do not update mxport->mcr_state when doing hardware in mxuport_set_rts()
655 * flow control. in mxuport_set_rts()
663 err = -EINVAL; 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()
776 return -ENOMEM; in mxuport_set_termios_flow()
778 /* S/W flow control settings */ 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()
797 enable, port->port_number); in mxuport_set_termios_flow()
803 /* H/W flow control settings */ 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()
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()
904 0, port->port_number, buf, 4); 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()
935 * Determine how many ports this device has dynamically. It will be
954 dev_warn(&serial->interface->dev, in mxuport_calc_num_ports()
955 "unknown device, assuming two ports\n"); 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()
981 return -ENOMEM; in mxuport_get_fw_version()
987 err = -EIO; in mxuport_get_fw_version()
1009 return -ENOMEM; in mxuport_download_fw()
1011 dev_dbg(&serial->interface->dev, "Starting firmware download...\n"); 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()
1032 } while (fwidx < fw_p->size); in mxuport_download_fw()
1050 u16 productid = le16_to_cpu(serial->dev->descriptor.idProduct); 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()
1100 dev_info(&serial->interface->dev, in mxuport_probe()
1108 * later use, eg, number of ports. 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()
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()
1137 0, port->port_number); in mxuport_port_probe()
1141 /* Set transmission mode (Hi-Performance) */ in mxuport_port_probe()
1143 0, port->port_number); in mxuport_port_probe()
1147 /* Set interface (RS-232) */ in mxuport_port_probe()
1150 port->port_number); in mxuport_port_probe()
1155 struct usb_serial_port *port0 = serial->port[0]; in mxuport_attach()
1156 struct usb_serial_port *port1 = serial->port[1]; in mxuport_attach()
1160 * All data from the ports is received on the first bulk in in mxuport_attach()
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()
1196 1, port->port_number); in mxuport_open()
1201 1, port->port_number); 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()
1226 port->port_number); 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()
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()
1248 enable, port->port_number); in mxuport_break_ctl()
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()