• Home
  • Raw
  • Download

Lines Matching +full:port +full:- +full:2

1 // SPDX-License-Identifier: GPL-2.0
3 * usb-serial driver for Quatech USB 2 devices
51 #define QT2_XMIT_HOLD 0x02 /* following 2 bytes are ?? */
52 #define QT2_CHANGE_PORT 0x03 /* following 1 byte is port to change to */
55 #define QT2_CONTROL_ESCAPE 0xff /* pass through previous 2 control bytes */
64 #define DRIVER_DESC "Quatech 2nd gen USB to Serial Driver"
67 #define QUATECH_SSU2_100 0xC120 /* RS232 single port */
68 #define QUATECH_DSU2_100 0xC140 /* RS232 dual port */
69 #define QUATECH_DSU2_400 0xC150 /* RS232/422/485 dual port */
70 #define QUATECH_QSU2_100 0xC160 /* RS232 four port */
71 #define QUATECH_QSU2_400 0xC170 /* RS232/422/485 four port */
72 #define QUATECH_ESU2_100 0xC1A0 /* RS232 eight port */
73 #define QUATECH_ESU2_400 0xC180 /* RS232/422/485 eight port */
86 {QT_DETAILS(QUATECH_DSU2_400, 2)},
87 {QT_DETAILS(QUATECH_DSU2_100, 2)},
108 unsigned char current_port; /* current port for incoming data */
126 struct usb_serial_port *port; member
129 static void qt2_update_lsr(struct usb_serial_port *port, unsigned char *ch);
130 static void qt2_update_msr(struct usb_serial_port *port, unsigned char *ch);
140 usb_kill_urb(serial_priv->read_urb); in qt2_release()
141 usb_free_urb(serial_priv->read_urb); in qt2_release()
142 kfree(serial_priv->read_buffer); in qt2_release()
153 if (((rem * 2) >= baudrate) && (baudrate != 110)) in calc_baud_divisor()
199 ret = -EIO; in qt2_getregister()
218 struct usb_serial_port *port = port_priv->port; in update_mctrl() local
219 struct usb_device *dev = port->serial->dev; in update_mctrl()
224 dev_dbg(&port->dev, in update_mctrl()
225 "update_mctrl - DTR|RTS not being set|cleared\n"); in update_mctrl()
236 status = qt2_setregister(dev, port_priv->device_port, UART_MCR, in update_mctrl()
239 dev_err(&port->dev, in update_mctrl()
240 "update_mctrl - Error from MODEM_CTRL urb: %i\n", in update_mctrl()
252 if (d.product_id == le16_to_cpu(serial->dev->descriptor.idProduct)) in qt2_calc_num_ports()
257 dev_err(&serial->dev->dev, in qt2_calc_num_ports()
264 struct usb_serial_port *port, in qt2_set_termios() argument
267 struct usb_device *dev = port->serial->dev; in qt2_set_termios()
269 struct ktermios *termios = &tty->termios; in qt2_set_termios()
271 unsigned int cflag = termios->c_cflag; in qt2_set_termios()
275 port_priv = usb_get_serial_port_data(port); in qt2_set_termios()
304 status = qt2_set_port_config(dev, port_priv->device_port, baud, in qt2_set_termios()
307 dev_err(&port->dev, "%s - qt2_set_port_config failed: %i\n", in qt2_set_termios()
313 port_priv->device_port); in qt2_set_termios()
316 0, port_priv->device_port); in qt2_set_termios()
318 dev_err(&port->dev, "%s - set HW flow control failed: %i\n", in qt2_set_termios()
325 x, port_priv->device_port); in qt2_set_termios()
328 0, port_priv->device_port); in qt2_set_termios()
331 dev_err(&port->dev, "%s - set SW flow control failed: %i\n", in qt2_set_termios()
336 static int qt2_open(struct tty_struct *tty, struct usb_serial_port *port) in qt2_open() argument
345 device_port = port->port_number; in qt2_open()
347 serial = port->serial; in qt2_open()
349 port_priv = usb_get_serial_port_data(port); in qt2_open()
351 /* set the port to RS232 mode */ in qt2_open()
352 status = qt2_control_msg(serial->dev, QT2_GET_SET_QMCR, in qt2_open()
355 dev_err(&port->dev, in qt2_open()
356 "%s failed to set RS232 mode for port %i error %i\n", in qt2_open()
361 data = kzalloc(2, GFP_KERNEL); in qt2_open()
363 return -ENOMEM; in qt2_open()
365 /* open the port */ in qt2_open()
366 status = usb_control_msg(serial->dev, in qt2_open()
367 usb_rcvctrlpipe(serial->dev, 0), in qt2_open()
370 device_port, data, 2, QT2_USB_TIMEOUT); in qt2_open()
372 if (status < 2) { in qt2_open()
373 dev_err(&port->dev, "%s - open port failed %i\n", __func__, in qt2_open()
376 status = -EIO; in qt2_open()
381 spin_lock_irqsave(&port_priv->lock, flags); in qt2_open()
382 port_priv->shadowLSR = data[0]; in qt2_open()
383 port_priv->shadowMSR = data[1]; in qt2_open()
384 spin_unlock_irqrestore(&port_priv->lock, flags); in qt2_open()
389 status = qt2_set_port_config(serial->dev, device_port, in qt2_open()
392 dev_err(&port->dev, "%s - initial setup failed (%i)\n", in qt2_open()
397 port_priv->device_port = (u8) device_port; in qt2_open()
400 qt2_set_termios(tty, port, &tty->termios); in qt2_open()
406 static void qt2_close(struct usb_serial_port *port) in qt2_close() argument
412 serial = port->serial; in qt2_close()
413 port_priv = usb_get_serial_port_data(port); in qt2_close()
415 usb_kill_urb(port_priv->write_urb); in qt2_close()
417 /* flush the port transmit buffer */ in qt2_close()
418 i = usb_control_msg(serial->dev, in qt2_close()
419 usb_sndctrlpipe(serial->dev, 0), in qt2_close()
421 port_priv->device_port, NULL, 0, QT2_USB_TIMEOUT); in qt2_close()
424 dev_err(&port->dev, "%s - transmit buffer flush failed: %i\n", in qt2_close()
427 /* flush the port receive buffer */ in qt2_close()
428 i = usb_control_msg(serial->dev, in qt2_close()
429 usb_sndctrlpipe(serial->dev, 0), in qt2_close()
431 port_priv->device_port, NULL, 0, QT2_USB_TIMEOUT); in qt2_close()
434 dev_err(&port->dev, "%s - receive buffer flush failed: %i\n", in qt2_close()
437 /* close the port */ in qt2_close()
438 i = usb_control_msg(serial->dev, in qt2_close()
439 usb_sndctrlpipe(serial->dev, 0), in qt2_close()
442 port_priv->device_port, NULL, 0, QT2_USB_TIMEOUT); in qt2_close()
445 dev_err(&port->dev, "%s - close port failed %i\n", in qt2_close()
453 usb_kill_urb(serial_priv->read_urb); in qt2_disconnect()
459 struct usb_serial_port *port = tty->driver_data; in get_serial_info() local
461 ss->line = port->minor; in get_serial_info()
462 ss->port = 0; in get_serial_info()
463 ss->irq = 0; in get_serial_info()
464 ss->xmit_fifo_size = port->bulk_out_size; in get_serial_info()
465 ss->baud_base = 9600; in get_serial_info()
466 ss->close_delay = 5*HZ; in get_serial_info()
467 ss->closing_wait = 30*HZ; in get_serial_info()
471 static void qt2_process_status(struct usb_serial_port *port, unsigned char *ch) in qt2_process_status() argument
475 qt2_update_lsr(port, ch + 1); in qt2_process_status()
478 qt2_update_msr(port, ch + 1); in qt2_process_status()
487 struct usb_serial_port *port; in qt2_process_read_urb() local
492 int len = urb->actual_length; in qt2_process_read_urb()
497 ch = urb->transfer_buffer; in qt2_process_read_urb()
498 serial = urb->context; in qt2_process_read_urb()
500 port = serial->port[serial_priv->current_port]; in qt2_process_read_urb()
502 for (i = 0; i < urb->actual_length; i++) { in qt2_process_read_urb()
503 ch = (unsigned char *)urb->transfer_buffer + i; in qt2_process_read_urb()
504 if ((i <= (len - 3)) && in qt2_process_read_urb()
508 switch (*(ch + 2)) { in qt2_process_read_urb()
511 if (i > (len - 4)) { in qt2_process_read_urb()
512 dev_warn(&port->dev, in qt2_process_read_urb()
513 "%s - status message too short\n", in qt2_process_read_urb()
517 qt2_process_status(port, ch + 2); in qt2_process_read_urb()
522 if (i > (len - 5)) { in qt2_process_read_urb()
523 dev_warn(&port->dev, in qt2_process_read_urb()
524 "%s - xmit_empty message too short\n", in qt2_process_read_urb()
533 if (i > (len - 4)) { in qt2_process_read_urb()
534 dev_warn(&port->dev, in qt2_process_read_urb()
535 "%s - change_port message too short\n", in qt2_process_read_urb()
539 tty_flip_buffer_push(&port->port); in qt2_process_read_urb()
543 if (newport > serial->num_ports) { in qt2_process_read_urb()
544 dev_err(&port->dev, in qt2_process_read_urb()
545 "%s - port change to invalid port: %i\n", in qt2_process_read_urb()
550 serial_priv->current_port = newport; in qt2_process_read_urb()
551 port = serial->port[serial_priv->current_port]; in qt2_process_read_urb()
557 i += 2; in qt2_process_read_urb()
561 tty_insert_flip_string(&port->port, ch, 2); in qt2_process_read_urb()
562 i += 2; in qt2_process_read_urb()
566 dev_warn(&port->dev, in qt2_process_read_urb()
567 "%s - unsupported command %i\n", in qt2_process_read_urb()
568 __func__, *(ch + 2)); in qt2_process_read_urb()
575 tty_insert_flip_char(&port->port, *ch, TTY_NORMAL); in qt2_process_read_urb()
578 tty_flip_buffer_push(&port->port); in qt2_process_read_urb()
583 struct usb_serial_port *port; in qt2_write_bulk_callback() local
587 port = urb->context; in qt2_write_bulk_callback()
588 port_priv = usb_get_serial_port_data(port); in qt2_write_bulk_callback()
590 spin_lock_irqsave(&port_priv->urb_lock, flags); in qt2_write_bulk_callback()
592 port_priv->urb_in_use = false; in qt2_write_bulk_callback()
593 usb_serial_port_softint(port); in qt2_write_bulk_callback()
595 spin_unlock_irqrestore(&port_priv->urb_lock, flags); in qt2_write_bulk_callback()
601 struct usb_serial *serial = urb->context; in qt2_read_bulk_callback()
604 if (urb->status) { in qt2_read_bulk_callback()
605 dev_warn(&serial->dev->dev, in qt2_read_bulk_callback()
606 "%s - non-zero urb status: %i\n", __func__, in qt2_read_bulk_callback()
607 urb->status); in qt2_read_bulk_callback()
615 dev_err(&serial->dev->dev, in qt2_read_bulk_callback()
616 "%s - resubmit read urb failed: %i\n", in qt2_read_bulk_callback()
626 port0 = serial->port[0]; in qt2_setup_urbs()
629 serial_priv->read_urb = usb_alloc_urb(0, GFP_KERNEL); in qt2_setup_urbs()
630 if (!serial_priv->read_urb) in qt2_setup_urbs()
631 return -ENOMEM; in qt2_setup_urbs()
633 usb_fill_bulk_urb(serial_priv->read_urb, serial->dev, in qt2_setup_urbs()
634 usb_rcvbulkpipe(serial->dev, in qt2_setup_urbs()
635 port0->bulk_in_endpointAddress), in qt2_setup_urbs()
636 serial_priv->read_buffer, in qt2_setup_urbs()
640 status = usb_submit_urb(serial_priv->read_urb, GFP_KERNEL); in qt2_setup_urbs()
642 dev_err(&serial->dev->dev, in qt2_setup_urbs()
643 "%s - submit read urb failed %i\n", __func__, status); in qt2_setup_urbs()
644 usb_free_urb(serial_priv->read_urb); in qt2_setup_urbs()
657 status = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), in qt2_attach()
661 dev_err(&serial->dev->dev, in qt2_attach()
662 "%s - failed to power on unit: %i\n", __func__, status); in qt2_attach()
668 return -ENOMEM; in qt2_attach()
670 serial_priv->read_buffer = kmalloc(QT2_READ_BUFFER_SIZE, GFP_KERNEL); in qt2_attach()
671 if (!serial_priv->read_buffer) { in qt2_attach()
672 status = -ENOMEM; in qt2_attach()
685 kfree(serial_priv->read_buffer); in qt2_attach()
691 static int qt2_port_probe(struct usb_serial_port *port) in qt2_port_probe() argument
693 struct usb_serial *serial = port->serial; in qt2_port_probe()
699 return -ENOMEM; in qt2_port_probe()
701 spin_lock_init(&port_priv->lock); in qt2_port_probe()
702 spin_lock_init(&port_priv->urb_lock); in qt2_port_probe()
703 port_priv->port = port; in qt2_port_probe()
705 port_priv->write_buffer = kmalloc(QT2_WRITE_BUFFER_SIZE, GFP_KERNEL); in qt2_port_probe()
706 if (!port_priv->write_buffer) in qt2_port_probe()
709 port_priv->write_urb = usb_alloc_urb(0, GFP_KERNEL); in qt2_port_probe()
710 if (!port_priv->write_urb) in qt2_port_probe()
713 bEndpointAddress = serial->port[0]->bulk_out_endpointAddress; in qt2_port_probe()
714 usb_fill_bulk_urb(port_priv->write_urb, serial->dev, in qt2_port_probe()
715 usb_sndbulkpipe(serial->dev, bEndpointAddress), in qt2_port_probe()
716 port_priv->write_buffer, in qt2_port_probe()
718 qt2_write_bulk_callback, port); in qt2_port_probe()
720 usb_set_serial_port_data(port, port_priv); in qt2_port_probe()
724 kfree(port_priv->write_buffer); in qt2_port_probe()
727 return -ENOMEM; in qt2_port_probe()
730 static int qt2_port_remove(struct usb_serial_port *port) in qt2_port_remove() argument
734 port_priv = usb_get_serial_port_data(port); in qt2_port_remove()
735 usb_free_urb(port_priv->write_urb); in qt2_port_remove()
736 kfree(port_priv->write_buffer); in qt2_port_remove()
744 struct usb_serial_port *port = tty->driver_data; in qt2_tiocmget() local
745 struct usb_device *dev = port->serial->dev; in qt2_tiocmget()
746 struct qt2_port_private *port_priv = usb_get_serial_port_data(port); in qt2_tiocmget()
750 d = kzalloc(2, GFP_KERNEL); in qt2_tiocmget()
752 return -ENOMEM; in qt2_tiocmget()
754 r = qt2_getregister(dev, port_priv->device_port, UART_MCR, d); in qt2_tiocmget()
758 r = qt2_getregister(dev, port_priv->device_port, UART_MSR, d + 1); in qt2_tiocmget()
779 port_priv = usb_get_serial_port_data(tty->driver_data); in qt2_tiocmset()
785 struct usb_serial_port *port = tty->driver_data; in qt2_break_ctl() local
790 port_priv = usb_get_serial_port_data(port); in qt2_break_ctl()
792 val = (break_state == -1) ? 1 : 0; in qt2_break_ctl()
794 status = qt2_control_msg(port->serial->dev, QT2_BREAK_CONTROL, in qt2_break_ctl()
795 val, port_priv->device_port); in qt2_break_ctl()
797 dev_warn(&port->dev, in qt2_break_ctl()
798 "%s - failed to send control message: %i\n", __func__, in qt2_break_ctl()
804 static void qt2_dtr_rts(struct usb_serial_port *port, int on) in qt2_dtr_rts() argument
806 struct usb_device *dev = port->serial->dev; in qt2_dtr_rts()
807 struct qt2_port_private *port_priv = usb_get_serial_port_data(port); in qt2_dtr_rts()
811 if (qt2_setregister(dev, port_priv->device_port, in qt2_dtr_rts()
813 dev_warn(&port->dev, "error from flowcontrol urb\n"); in qt2_dtr_rts()
822 static void qt2_update_msr(struct usb_serial_port *port, unsigned char *ch) in qt2_update_msr() argument
828 /* May be called from qt2_process_read_urb() for an unbound port. */ in qt2_update_msr()
829 port_priv = usb_get_serial_port_data(port); in qt2_update_msr()
833 spin_lock_irqsave(&port_priv->lock, flags); in qt2_update_msr()
834 port_priv->shadowMSR = newMSR; in qt2_update_msr()
835 spin_unlock_irqrestore(&port_priv->lock, flags); in qt2_update_msr()
840 port->icount.cts++; in qt2_update_msr()
842 port->icount.dsr++; in qt2_update_msr()
844 port->icount.dcd++; in qt2_update_msr()
846 port->icount.rng++; in qt2_update_msr()
848 wake_up_interruptible(&port->port.delta_msr_wait); in qt2_update_msr()
852 static void qt2_update_lsr(struct usb_serial_port *port, unsigned char *ch) in qt2_update_lsr() argument
859 /* May be called from qt2_process_read_urb() for an unbound port. */ in qt2_update_lsr()
860 port_priv = usb_get_serial_port_data(port); in qt2_update_lsr()
867 spin_lock_irqsave(&port_priv->lock, flags); in qt2_update_lsr()
868 port_priv->shadowLSR = newLSR; in qt2_update_lsr()
869 spin_unlock_irqrestore(&port_priv->lock, flags); in qt2_update_lsr()
871 icount = &port->icount; in qt2_update_lsr()
876 icount->brk++; in qt2_update_lsr()
879 icount->overrun++; in qt2_update_lsr()
882 icount->parity++; in qt2_update_lsr()
885 icount->frame++; in qt2_update_lsr()
892 struct usb_serial_port *port = tty->driver_data; in qt2_write_room() local
897 port_priv = usb_get_serial_port_data(port); in qt2_write_room()
899 spin_lock_irqsave(&port_priv->urb_lock, flags); in qt2_write_room()
901 if (port_priv->urb_in_use) in qt2_write_room()
904 r = QT2_WRITE_BUFFER_SIZE - QT2_WRITE_CONTROL_SIZE; in qt2_write_room()
906 spin_unlock_irqrestore(&port_priv->urb_lock, flags); in qt2_write_room()
912 struct usb_serial_port *port, in qt2_write() argument
922 port_priv = usb_get_serial_port_data(port); in qt2_write()
924 if (port_priv->write_urb == NULL) { in qt2_write()
925 dev_err(&port->dev, "%s - no output urb\n", __func__); in qt2_write()
928 write_urb = port_priv->write_urb; in qt2_write()
930 count = min(count, QT2_WRITE_BUFFER_SIZE - QT2_WRITE_CONTROL_SIZE); in qt2_write()
932 data = write_urb->transfer_buffer; in qt2_write()
933 spin_lock_irqsave(&port_priv->urb_lock, flags); in qt2_write()
934 if (port_priv->urb_in_use) { in qt2_write()
935 dev_err(&port->dev, "qt2_write - urb is in use\n"); in qt2_write()
941 *data++ = port_priv->device_port; in qt2_write()
943 data += 2; in qt2_write()
946 write_urb->transfer_buffer_length = count + QT2_WRITE_CONTROL_SIZE; in qt2_write()
950 port_priv->urb_in_use = true; in qt2_write()
955 spin_unlock_irqrestore(&port_priv->urb_lock, flags); in qt2_write()
963 .name = "quatech-serial",