Lines Matching +full:rs485 +full:- +full:rts +full:- +full:delay

1 // SPDX-License-Identifier: GPL-2.0+
3 * mxser.c -- MOXA Smartio/Industio family multiport serial driver.
5 * Copyright (C) 1999-2006 Moxa Technologies (support@moxa.com).
6 * Copyright (C) 2006-2008 Jiri Slaby <jirislaby@gmail.com>
15 * - Fixed x86_64 cleanness
34 #include <linux/delay.h>
45 * Semi-public control interfaces
62 /* --------------------------------------------------- */
115 #define MOXA_MUST_IER_ERTSI 0x40 /* enable RTS interrupt */
130 /* RTS/CTS change state interrupt pending */
336 u8 oldlcr = mxser_must_select_bank(info->ioaddr, MOXA_MUST_EFR_BANK1); in mxser_set_must_fifo_value()
337 outb(info->rx_high_water, info->ioaddr + MOXA_MUST_RBRTH_REGISTER); in mxser_set_must_fifo_value()
338 outb(info->rx_high_water, info->ioaddr + MOXA_MUST_RBRTI_REGISTER); in mxser_set_must_fifo_value()
339 outb(info->rx_low_water, info->ioaddr + MOXA_MUST_RBRTL_REGISTER); in mxser_set_must_fifo_value()
340 outb(oldlcr, info->ioaddr + UART_LCR); in mxser_set_must_fifo_value()
413 return info->type == PORT_16550A || info->board->must_hwid; in mxser_16550A_or_MUST()
420 if (info->type == PORT_16450 || info->type == PORT_8250) { in mxser_process_txrx_fifo()
421 info->rx_high_water = 1; in mxser_process_txrx_fifo()
422 info->rx_low_water = 1; in mxser_process_txrx_fifo()
423 info->xmit_fifo_size = 1; in mxser_process_txrx_fifo()
428 if (info->board->must_hwid == Gpci_uart_info[i].type) { in mxser_process_txrx_fifo()
429 info->rx_low_water = Gpci_uart_info[i].rx_low_water; in mxser_process_txrx_fifo()
430 info->rx_high_water = Gpci_uart_info[i].rx_high_water; in mxser_process_txrx_fifo()
431 info->xmit_fifo_size = Gpci_uart_info[i].fifo_size; in mxser_process_txrx_fifo()
438 outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER); in __mxser_start_tx()
439 info->IER |= UART_IER_THRI; in __mxser_start_tx()
440 outb(info->IER, info->ioaddr + UART_IER); in __mxser_start_tx()
447 spin_lock_irqsave(&info->slock, flags); in mxser_start_tx()
449 spin_unlock_irqrestore(&info->slock, flags); in mxser_start_tx()
454 info->IER &= ~UART_IER_THRI; in __mxser_stop_tx()
455 outb(info->IER, info->ioaddr + UART_IER); in __mxser_stop_tx()
462 return inb(mp->ioaddr + UART_MSR) & UART_MSR_DCD; in mxser_carrier_raised()
471 spin_lock_irqsave(&mp->slock, flags); in mxser_dtr_rts()
472 mcr = inb(mp->ioaddr + UART_MCR); in mxser_dtr_rts()
477 outb(mcr, mp->ioaddr + UART_MCR); in mxser_dtr_rts()
478 spin_unlock_irqrestore(&mp->slock, flags); in mxser_dtr_rts()
483 struct mxser_port *info = tty->driver_data; in mxser_set_baud()
488 if (newspd > info->board->max_baud) in mxser_set_baud()
489 return -1; in mxser_set_baud()
508 timeout = (u64)info->xmit_fifo_size * HZ * 10 * quot; in mxser_set_baud()
510 info->timeout = timeout + HZ / 50; /* Add .02 seconds of slop */ in mxser_set_baud()
513 info->MCR |= UART_MCR_DTR; in mxser_set_baud()
514 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_set_baud()
516 info->MCR &= ~UART_MCR_DTR; in mxser_set_baud()
517 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_set_baud()
521 cval = inb(info->ioaddr + UART_LCR); in mxser_set_baud()
523 outb(cval | UART_LCR_DLAB, info->ioaddr + UART_LCR); /* set DLAB */ in mxser_set_baud()
525 outb(quot & 0xff, info->ioaddr + UART_DLL); /* LS of divisor */ in mxser_set_baud()
526 outb(quot >> 8, info->ioaddr + UART_DLM); /* MS of divisor */ in mxser_set_baud()
527 outb(cval, info->ioaddr + UART_LCR); /* reset DLAB */ in mxser_set_baud()
538 mxser_set_must_enum_value(info->ioaddr, quot); in mxser_set_baud()
540 mxser_set_must_enum_value(info->ioaddr, 0); in mxser_set_baud()
551 if (tty->hw_stopped) { in mxser_handle_cts()
553 tty->hw_stopped = false; in mxser_handle_cts()
563 tty->hw_stopped = true; in mxser_handle_cts()
575 struct mxser_port *info = tty->driver_data; in mxser_change_speed()
578 cflag = tty->termios.c_cflag; in mxser_change_speed()
589 cval = UART_LCR_WLEN(tty_get_char_size(tty->termios.c_cflag)); in mxser_change_speed()
600 info->FCR = 0; in mxser_change_speed()
601 if (info->board->must_hwid) { in mxser_change_speed()
602 info->FCR |= UART_FCR_ENABLE_FIFO | in mxser_change_speed()
605 } else if (info->type != PORT_8250 && info->type != PORT_16450) { in mxser_change_speed()
606 info->FCR |= UART_FCR_ENABLE_FIFO; in mxser_change_speed()
607 switch (info->rx_high_water) { in mxser_change_speed()
609 info->FCR |= UART_FCR_TRIGGER_1; in mxser_change_speed()
612 info->FCR |= UART_FCR_TRIGGER_4; in mxser_change_speed()
615 info->FCR |= UART_FCR_TRIGGER_8; in mxser_change_speed()
618 info->FCR |= UART_FCR_TRIGGER_14; in mxser_change_speed()
624 info->IER &= ~UART_IER_MSI; in mxser_change_speed()
625 info->MCR &= ~UART_MCR_AFE; in mxser_change_speed()
626 tty_port_set_cts_flow(&info->port, cflag & CRTSCTS); in mxser_change_speed()
628 info->IER |= UART_IER_MSI; in mxser_change_speed()
630 info->MCR |= UART_MCR_AFE; in mxser_change_speed()
633 inb(info->ioaddr + UART_MSR)); in mxser_change_speed()
636 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_change_speed()
637 tty_port_set_check_carrier(&info->port, ~cflag & CLOCAL); in mxser_change_speed()
639 info->IER |= UART_IER_MSI; in mxser_change_speed()
640 outb(info->IER, info->ioaddr + UART_IER); in mxser_change_speed()
645 info->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; in mxser_change_speed()
647 info->read_status_mask |= UART_LSR_FE | UART_LSR_PE; in mxser_change_speed()
649 info->read_status_mask |= UART_LSR_BI; in mxser_change_speed()
651 info->ignore_status_mask = 0; in mxser_change_speed()
654 info->ignore_status_mask |= UART_LSR_BI; in mxser_change_speed()
655 info->read_status_mask |= UART_LSR_BI; in mxser_change_speed()
661 info->ignore_status_mask |= in mxser_change_speed()
665 info->read_status_mask |= in mxser_change_speed()
671 if (info->board->must_hwid) { in mxser_change_speed()
672 mxser_set_must_xon1_value(info->ioaddr, START_CHAR(tty)); in mxser_change_speed()
673 mxser_set_must_xoff1_value(info->ioaddr, STOP_CHAR(tty)); in mxser_change_speed()
674 mxser_must_set_rx_sw_flow_control(info->ioaddr, I_IXON(tty)); in mxser_change_speed()
675 mxser_must_set_tx_sw_flow_control(info->ioaddr, I_IXOFF(tty)); in mxser_change_speed()
679 outb(info->FCR, info->ioaddr + UART_FCR); in mxser_change_speed()
680 outb(cval, info->ioaddr + UART_LCR); in mxser_change_speed()
686 u8 msr = inb(port->ioaddr + UART_MSR); in mxser_check_modem_status()
693 port->icount.rng++; in mxser_check_modem_status()
695 port->icount.dsr++; in mxser_check_modem_status()
697 port->icount.dcd++; in mxser_check_modem_status()
699 port->icount.cts++; in mxser_check_modem_status()
700 wake_up_interruptible(&port->port.delta_msr_wait); in mxser_check_modem_status()
702 if (tty_port_check_carrier(&port->port) && (msr & UART_MSR_DDCD)) { in mxser_check_modem_status()
704 wake_up_interruptible(&port->port.open_wait); in mxser_check_modem_status()
707 if (tty_port_cts_enabled(&port->port)) in mxser_check_modem_status()
717 if (info->board->must_hwid) in mxser_disable_and_clear_FIFO()
720 outb(fcr, info->ioaddr + UART_FCR); in mxser_disable_and_clear_FIFO()
733 spin_lock_irqsave(&info->slock, flags); in mxser_activate()
735 if (!info->type) { in mxser_activate()
736 set_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
737 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
753 if (inb(info->ioaddr + UART_LSR) == 0xff) { in mxser_activate()
754 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
756 set_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
760 ret = -ENODEV; in mxser_activate()
767 (void) inb(info->ioaddr + UART_LSR); in mxser_activate()
768 (void) inb(info->ioaddr + UART_RX); in mxser_activate()
769 (void) inb(info->ioaddr + UART_IIR); in mxser_activate()
770 (void) inb(info->ioaddr + UART_MSR); in mxser_activate()
775 outb(UART_LCR_WLEN8, info->ioaddr + UART_LCR); /* reset DLAB */ in mxser_activate()
776 info->MCR = UART_MCR_DTR | UART_MCR_RTS; in mxser_activate()
777 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_activate()
782 info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; in mxser_activate()
784 if (info->board->must_hwid) in mxser_activate()
785 info->IER |= MOXA_MUST_IER_EGDAI; in mxser_activate()
786 outb(info->IER, info->ioaddr + UART_IER); /* enable interrupts */ in mxser_activate()
791 (void) inb(info->ioaddr + UART_LSR); in mxser_activate()
792 (void) inb(info->ioaddr + UART_RX); in mxser_activate()
793 (void) inb(info->ioaddr + UART_IIR); in mxser_activate()
794 (void) inb(info->ioaddr + UART_MSR); in mxser_activate()
796 clear_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
797 kfifo_reset(&port->xmit_fifo); in mxser_activate()
803 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
818 info->IER &= ~UART_IER_RLSI; in mxser_stop_rx()
819 if (info->board->must_hwid) in mxser_stop_rx()
820 info->IER &= ~MOXA_MUST_RECV_ISR; in mxser_stop_rx()
822 outb(info->IER, info->ioaddr + UART_IER); in mxser_stop_rx()
833 spin_lock_irqsave(&info->slock, flags); in mxser_shutdown_port()
841 wake_up_interruptible(&info->port.delta_msr_wait); in mxser_shutdown_port()
843 info->IER = 0; in mxser_shutdown_port()
844 outb(0x00, info->ioaddr + UART_IER); in mxser_shutdown_port()
850 (void) inb(info->ioaddr + UART_RX); in mxser_shutdown_port()
853 if (info->board->must_hwid) in mxser_shutdown_port()
854 mxser_must_no_sw_flow_control(info->ioaddr); in mxser_shutdown_port()
856 spin_unlock_irqrestore(&info->slock, flags); in mxser_shutdown_port()
859 synchronize_irq(info->board->irq); in mxser_shutdown_port()
867 * the IRQ chain. It also performs the serial-specific
872 struct tty_port *tport = tty->port; in mxser_open()
875 tty->driver_data = port; in mxser_open()
882 struct mxser_port *info = tty->driver_data; in mxser_flush_buffer()
885 spin_lock_irqsave(&info->slock, flags); in mxser_flush_buffer()
886 kfifo_reset(&info->port.xmit_fifo); in mxser_flush_buffer()
888 outb(info->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, in mxser_flush_buffer()
889 info->ioaddr + UART_FCR); in mxser_flush_buffer()
891 spin_unlock_irqrestore(&info->slock, flags); in mxser_flush_buffer()
898 tty_port_close(tty->port, tty, filp); in mxser_close()
903 struct mxser_port *info = tty->driver_data; in mxser_write()
908 spin_lock_irqsave(&info->slock, flags); in mxser_write()
909 written = kfifo_in(&info->port.xmit_fifo, buf, count); in mxser_write()
910 is_empty = kfifo_is_empty(&info->port.xmit_fifo); in mxser_write()
911 spin_unlock_irqrestore(&info->slock, flags); in mxser_write()
913 if (!is_empty && !tty->flow.stopped) in mxser_write()
914 if (!tty->hw_stopped || mxser_16550A_or_MUST(info)) in mxser_write()
922 struct mxser_port *info = tty->driver_data; in mxser_put_char()
926 spin_lock_irqsave(&info->slock, flags); in mxser_put_char()
927 ret = kfifo_put(&info->port.xmit_fifo, ch); in mxser_put_char()
928 spin_unlock_irqrestore(&info->slock, flags); in mxser_put_char()
936 struct mxser_port *info = tty->driver_data; in mxser_flush_chars()
938 if (kfifo_is_empty(&info->port.xmit_fifo) || tty->flow.stopped || in mxser_flush_chars()
939 (tty->hw_stopped && !mxser_16550A_or_MUST(info))) in mxser_flush_chars()
947 struct mxser_port *info = tty->driver_data; in mxser_write_room()
949 return kfifo_avail(&info->port.xmit_fifo); in mxser_write_room()
954 struct mxser_port *info = tty->driver_data; in mxser_chars_in_buffer()
956 return kfifo_len(&info->port.xmit_fifo); in mxser_chars_in_buffer()
960 * ------------------------------------------------------------
962 * ------------------------------------------------------------
967 struct mxser_port *info = tty->driver_data; in mxser_get_serial_info()
968 struct tty_port *port = &info->port; in mxser_get_serial_info()
971 mutex_lock(&port->mutex); in mxser_get_serial_info()
973 close_delay = jiffies_to_msecs(info->port.close_delay) / 10; in mxser_get_serial_info()
974 closing_wait = info->port.closing_wait; in mxser_get_serial_info()
978 ss->type = info->type; in mxser_get_serial_info()
979 ss->line = tty->index; in mxser_get_serial_info()
980 ss->port = info->ioaddr; in mxser_get_serial_info()
981 ss->irq = info->board->irq; in mxser_get_serial_info()
982 ss->flags = info->port.flags; in mxser_get_serial_info()
983 ss->baud_base = MXSER_BAUD_BASE; in mxser_get_serial_info()
984 ss->close_delay = close_delay; in mxser_get_serial_info()
985 ss->closing_wait = closing_wait; in mxser_get_serial_info()
986 ss->custom_divisor = MXSER_CUSTOM_DIVISOR; in mxser_get_serial_info()
987 mutex_unlock(&port->mutex); in mxser_get_serial_info()
994 struct mxser_port *info = tty->driver_data; in mxser_set_serial_info()
995 struct tty_port *port = &info->port; in mxser_set_serial_info()
1002 return -EIO; in mxser_set_serial_info()
1004 mutex_lock(&port->mutex); in mxser_set_serial_info()
1006 if (ss->irq != info->board->irq || in mxser_set_serial_info()
1007 ss->port != info->ioaddr) { in mxser_set_serial_info()
1008 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1009 return -EINVAL; in mxser_set_serial_info()
1012 old_speed = port->flags & ASYNC_SPD_MASK; in mxser_set_serial_info()
1014 close_delay = msecs_to_jiffies(ss->close_delay * 10); in mxser_set_serial_info()
1015 closing_wait = ss->closing_wait; in mxser_set_serial_info()
1020 if ((ss->baud_base != MXSER_BAUD_BASE) || in mxser_set_serial_info()
1021 (close_delay != port->close_delay) || in mxser_set_serial_info()
1022 (closing_wait != port->closing_wait) || in mxser_set_serial_info()
1023 ((ss->flags & ~ASYNC_USR_MASK) != (port->flags & ~ASYNC_USR_MASK))) { in mxser_set_serial_info()
1024 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1025 return -EPERM; in mxser_set_serial_info()
1027 port->flags = (port->flags & ~ASYNC_USR_MASK) | in mxser_set_serial_info()
1028 (ss->flags & ASYNC_USR_MASK); in mxser_set_serial_info()
1034 port->flags = ((port->flags & ~ASYNC_FLAGS) | in mxser_set_serial_info()
1035 (ss->flags & ASYNC_FLAGS)); in mxser_set_serial_info()
1036 port->close_delay = close_delay; in mxser_set_serial_info()
1037 port->closing_wait = closing_wait; in mxser_set_serial_info()
1038 if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST && in mxser_set_serial_info()
1039 (ss->baud_base != MXSER_BAUD_BASE || in mxser_set_serial_info()
1040 ss->custom_divisor != in mxser_set_serial_info()
1042 if (ss->custom_divisor == 0) { in mxser_set_serial_info()
1043 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1044 return -EINVAL; in mxser_set_serial_info()
1046 baud = ss->baud_base / ss->custom_divisor; in mxser_set_serial_info()
1050 info->type = ss->type; in mxser_set_serial_info()
1056 if (old_speed != (port->flags & ASYNC_SPD_MASK)) { in mxser_set_serial_info()
1057 spin_lock_irqsave(&info->slock, sl_flags); in mxser_set_serial_info()
1059 spin_unlock_irqrestore(&info->slock, sl_flags); in mxser_set_serial_info()
1066 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1071 * mxser_get_lsr_info - get line status register info
1074 * is emptied. On bus types like RS485, the transmitter must
1078 * allows an RS485 driver to be written in user space.
1087 spin_lock_irqsave(&info->slock, flags); in mxser_get_lsr_info()
1088 status = inb(info->ioaddr + UART_LSR); in mxser_get_lsr_info()
1089 spin_unlock_irqrestore(&info->slock, flags); in mxser_get_lsr_info()
1096 struct mxser_port *info = tty->driver_data; in mxser_tiocmget()
1102 return -EIO; in mxser_tiocmget()
1104 spin_lock_irqsave(&info->slock, flags); in mxser_tiocmget()
1105 control = info->MCR; in mxser_tiocmget()
1107 spin_unlock_irqrestore(&info->slock, flags); in mxser_tiocmget()
1120 struct mxser_port *info = tty->driver_data; in mxser_tiocmset()
1124 return -EIO; in mxser_tiocmset()
1126 spin_lock_irqsave(&info->slock, flags); in mxser_tiocmset()
1129 info->MCR |= UART_MCR_RTS; in mxser_tiocmset()
1131 info->MCR |= UART_MCR_DTR; in mxser_tiocmset()
1134 info->MCR &= ~UART_MCR_RTS; in mxser_tiocmset()
1136 info->MCR &= ~UART_MCR_DTR; in mxser_tiocmset()
1138 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_tiocmset()
1139 spin_unlock_irqrestore(&info->slock, flags); in mxser_tiocmset()
1150 spin_lock_irqsave(&info->slock, flags); in mxser_cflags_changed()
1151 cnow = info->icount; /* atomic copy */ in mxser_cflags_changed()
1152 spin_unlock_irqrestore(&info->slock, flags); in mxser_cflags_changed()
1154 ret = ((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) || in mxser_cflags_changed()
1155 ((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) || in mxser_cflags_changed()
1156 ((arg & TIOCM_CD) && (cnow.dcd != cprev->dcd)) || in mxser_cflags_changed()
1157 ((arg & TIOCM_CTS) && (cnow.cts != cprev->cts)); in mxser_cflags_changed()
1172 if (port->board->must_hwid != MOXA_MUST_MU860_HWID) in mxser_ioctl_op_mode()
1173 return -EFAULT; in mxser_ioctl_op_mode()
1177 return -EFAULT; in mxser_ioctl_op_mode()
1180 return -EINVAL; in mxser_ioctl_op_mode()
1182 spin_lock_irq(&port->slock); in mxser_ioctl_op_mode()
1183 val = inb(port->opmode_ioaddr); in mxser_ioctl_op_mode()
1186 outb(val, port->opmode_ioaddr); in mxser_ioctl_op_mode()
1187 spin_unlock_irq(&port->slock); in mxser_ioctl_op_mode()
1192 spin_lock_irq(&port->slock); in mxser_ioctl_op_mode()
1193 opmode = inb(port->opmode_ioaddr) >> shiftbit; in mxser_ioctl_op_mode()
1194 spin_unlock_irq(&port->slock); in mxser_ioctl_op_mode()
1202 struct mxser_port *info = tty->driver_data; in mxser_ioctl()
1208 return mxser_ioctl_op_mode(info, tty->index, in mxser_ioctl()
1212 return -EIO; in mxser_ioctl()
1219 * - mask passed in arg for lines of interest in mxser_ioctl()
1224 spin_lock_irqsave(&info->slock, flags); in mxser_ioctl()
1225 cnow = info->icount; /* note the counters on entry */ in mxser_ioctl()
1226 spin_unlock_irqrestore(&info->slock, flags); in mxser_ioctl()
1228 return wait_event_interruptible(info->port.delta_msr_wait, in mxser_ioctl()
1231 return -ENOIOCTLCMD; in mxser_ioctl()
1239 * NB: both 1->0 and 0->1 transitions are counted except for
1240 * RI where only 0->1 is counted.
1247 struct mxser_port *info = tty->driver_data; in mxser_get_icount()
1251 spin_lock_irqsave(&info->slock, flags); in mxser_get_icount()
1252 cnow = info->icount; in mxser_get_icount()
1253 spin_unlock_irqrestore(&info->slock, flags); in mxser_get_icount()
1255 icount->frame = cnow.frame; in mxser_get_icount()
1256 icount->brk = cnow.brk; in mxser_get_icount()
1257 icount->overrun = cnow.overrun; in mxser_get_icount()
1258 icount->buf_overrun = cnow.buf_overrun; in mxser_get_icount()
1259 icount->parity = cnow.parity; in mxser_get_icount()
1260 icount->rx = cnow.rx; in mxser_get_icount()
1261 icount->tx = cnow.tx; in mxser_get_icount()
1262 icount->cts = cnow.cts; in mxser_get_icount()
1263 icount->dsr = cnow.dsr; in mxser_get_icount()
1264 icount->rng = cnow.rng; in mxser_get_icount()
1265 icount->dcd = cnow.dcd; in mxser_get_icount()
1270 * This routine is called by the upper-layer tty layer to signal that
1275 struct mxser_port *info = tty->driver_data; in mxser_throttle()
1278 if (info->board->must_hwid) { in mxser_throttle()
1279 info->IER &= ~MOXA_MUST_RECV_ISR; in mxser_throttle()
1280 outb(info->IER, info->ioaddr + UART_IER); in mxser_throttle()
1282 info->x_char = STOP_CHAR(tty); in mxser_throttle()
1283 outb(0, info->ioaddr + UART_IER); in mxser_throttle()
1284 info->IER |= UART_IER_THRI; in mxser_throttle()
1285 outb(info->IER, info->ioaddr + UART_IER); in mxser_throttle()
1290 info->MCR &= ~UART_MCR_RTS; in mxser_throttle()
1291 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_throttle()
1297 struct mxser_port *info = tty->driver_data; in mxser_unthrottle()
1301 if (info->x_char) in mxser_unthrottle()
1302 info->x_char = 0; in mxser_unthrottle()
1304 if (info->board->must_hwid) { in mxser_unthrottle()
1305 info->IER |= MOXA_MUST_RECV_ISR; in mxser_unthrottle()
1306 outb(info->IER, info->ioaddr + UART_IER); in mxser_unthrottle()
1308 info->x_char = START_CHAR(tty); in mxser_unthrottle()
1309 outb(0, info->ioaddr + UART_IER); in mxser_unthrottle()
1310 info->IER |= UART_IER_THRI; in mxser_unthrottle()
1311 outb(info->IER, info->ioaddr + UART_IER); in mxser_unthrottle()
1317 info->MCR |= UART_MCR_RTS; in mxser_unthrottle()
1318 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_unthrottle()
1325 * This routines are called before setting or resetting tty->flow.stopped.
1330 struct mxser_port *info = tty->driver_data; in mxser_stop()
1333 spin_lock_irqsave(&info->slock, flags); in mxser_stop()
1334 if (info->IER & UART_IER_THRI) in mxser_stop()
1336 spin_unlock_irqrestore(&info->slock, flags); in mxser_stop()
1341 struct mxser_port *info = tty->driver_data; in mxser_start()
1344 spin_lock_irqsave(&info->slock, flags); in mxser_start()
1345 if (!kfifo_is_empty(&info->port.xmit_fifo)) in mxser_start()
1347 spin_unlock_irqrestore(&info->slock, flags); in mxser_start()
1353 struct mxser_port *info = tty->driver_data; in mxser_set_termios()
1356 spin_lock_irqsave(&info->slock, flags); in mxser_set_termios()
1358 spin_unlock_irqrestore(&info->slock, flags); in mxser_set_termios()
1360 if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) { in mxser_set_termios()
1361 tty->hw_stopped = false; in mxser_set_termios()
1366 if ((old_termios->c_iflag & IXON) && !I_IXON(tty)) { in mxser_set_termios()
1367 tty->flow.stopped = 0; in mxser_set_termios()
1369 if (info->board->must_hwid) { in mxser_set_termios()
1370 spin_lock_irqsave(&info->slock, flags); in mxser_set_termios()
1371 mxser_must_set_rx_sw_flow_control(info->ioaddr, false); in mxser_set_termios()
1372 spin_unlock_irqrestore(&info->slock, flags); in mxser_set_termios()
1384 spin_lock_irqsave(&info->slock, flags); in mxser_tx_empty()
1385 lsr = inb(info->ioaddr + UART_LSR); in mxser_tx_empty()
1386 spin_unlock_irqrestore(&info->slock, flags); in mxser_tx_empty()
1392 * mxser_wait_until_sent() --- wait until the transmitter is empty
1396 struct mxser_port *info = tty->driver_data; in mxser_wait_until_sent()
1399 if (info->type == PORT_UNKNOWN) in mxser_wait_until_sent()
1402 if (info->xmit_fifo_size == 0) in mxser_wait_until_sent()
1411 * the NIST-PCTS. in mxser_wait_until_sent()
1413 char_time = (info->timeout - HZ / 50) / info->xmit_fifo_size; in mxser_wait_until_sent()
1427 * takes longer than info->timeout, this is probably due to a in mxser_wait_until_sent()
1429 * 2*info->timeout. in mxser_wait_until_sent()
1431 if (!timeout || timeout > 2 * info->timeout) in mxser_wait_until_sent()
1432 timeout = 2 * info->timeout; in mxser_wait_until_sent()
1450 struct mxser_port *info = tty->driver_data; in mxser_hangup()
1453 tty_port_hangup(&info->port); in mxser_hangup()
1457 * mxser_rs_break() --- routine which turns the break handling on or off
1461 struct mxser_port *info = tty->driver_data; in mxser_rs_break()
1465 spin_lock_irqsave(&info->slock, flags); in mxser_rs_break()
1466 lcr = inb(info->ioaddr + UART_LCR); in mxser_rs_break()
1467 if (break_state == -1) in mxser_rs_break()
1471 outb(lcr, info->ioaddr + UART_LCR); in mxser_rs_break()
1472 spin_unlock_irqrestore(&info->slock, flags); in mxser_rs_break()
1479 enum mxser_must_hwid hwid = port->board->must_hwid; in mxser_receive_chars_new()
1487 gdl = inb(port->ioaddr + MOXA_MUST_GDL_REGISTER); in mxser_receive_chars_new()
1491 while (gdl--) { in mxser_receive_chars_new()
1492 u8 ch = inb(port->ioaddr + UART_RX); in mxser_receive_chars_new()
1493 if (!tty_insert_flip_char(&port->port, ch, 0)) in mxser_receive_chars_new()
1494 port->icount.buf_overrun++; in mxser_receive_chars_new()
1503 enum mxser_must_hwid hwid = port->board->must_hwid; in mxser_receive_chars_old()
1509 if (max-- < 0) in mxser_receive_chars_old()
1512 ch = inb(port->ioaddr + UART_RX); in mxser_receive_chars_old()
1514 outb(port->FCR | UART_FCR_CLEAR_RCVR, in mxser_receive_chars_old()
1515 port->ioaddr + UART_FCR); in mxser_receive_chars_old()
1516 status &= port->read_status_mask; in mxser_receive_chars_old()
1517 if (status & port->ignore_status_mask) { in mxser_receive_chars_old()
1525 port->icount.brk++; in mxser_receive_chars_old()
1527 if (port->port.flags & ASYNC_SAK) in mxser_receive_chars_old()
1531 port->icount.parity++; in mxser_receive_chars_old()
1534 port->icount.frame++; in mxser_receive_chars_old()
1537 port->icount.overrun++; in mxser_receive_chars_old()
1540 if (!tty_insert_flip_char(&port->port, ch, flag)) { in mxser_receive_chars_old()
1541 port->icount.buf_overrun++; in mxser_receive_chars_old()
1549 status = inb(port->ioaddr + UART_LSR); in mxser_receive_chars_old()
1561 tty_flip_buffer_push(&port->port); in mxser_receive_chars()
1570 if (port->x_char) { in mxser_transmit_chars()
1571 outb(port->x_char, port->ioaddr + UART_TX); in mxser_transmit_chars()
1572 port->x_char = 0; in mxser_transmit_chars()
1573 port->icount.tx++; in mxser_transmit_chars()
1577 if (kfifo_is_empty(&port->port.xmit_fifo) || tty->flow.stopped || in mxser_transmit_chars()
1578 (tty->hw_stopped && !mxser_16550A_or_MUST(port))) { in mxser_transmit_chars()
1583 count = port->xmit_fifo_size; in mxser_transmit_chars()
1587 if (!kfifo_get(&port->port.xmit_fifo, &c)) in mxser_transmit_chars()
1590 outb(c, port->ioaddr + UART_TX); in mxser_transmit_chars()
1591 port->icount.tx++; in mxser_transmit_chars()
1592 } while (--count > 0); in mxser_transmit_chars()
1594 if (kfifo_len(&port->port.xmit_fifo) < WAKEUP_CHARS) in mxser_transmit_chars()
1597 if (kfifo_is_empty(&port->port.xmit_fifo)) in mxser_transmit_chars()
1607 iir = inb(port->ioaddr + UART_IIR); in mxser_port_isr()
1612 tty = tty_port_tty_get(&port->port); in mxser_port_isr()
1614 status = inb(port->ioaddr + UART_LSR); in mxser_port_isr()
1615 outb(port->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, in mxser_port_isr()
1616 port->ioaddr + UART_FCR); in mxser_port_isr()
1617 inb(port->ioaddr + UART_MSR); in mxser_port_isr()
1623 status = inb(port->ioaddr + UART_LSR); in mxser_port_isr()
1625 if (port->board->must_hwid) { in mxser_port_isr()
1632 status &= port->read_status_mask; in mxser_port_isr()
1639 if (port->board->must_hwid) { in mxser_port_isr()
1661 unsigned int i, max = brd->nports; in mxser_interrupt()
1663 u8 irqbits, bits, mask = BIT(max) - 1; in mxser_interrupt()
1666 irqbits = inb(brd->vector) & mask; in mxser_interrupt()
1676 port = &brd->ports[i]; in mxser_interrupt()
1679 spin_lock(&port->slock); in mxser_interrupt()
1684 spin_unlock(&port->slock); in mxser_interrupt()
1724 * The MOXA Smartio/Industio serial driver boot-time initialization code!
1733 brd->must_hwid = mxser_must_get_hwid(brd->ports[0].ioaddr); in mxser_initbrd()
1734 is_mu860 = brd->must_hwid == MOXA_MUST_MU860_HWID; in mxser_initbrd()
1737 if (Gpci_uart_info[i].type == brd->must_hwid) { in mxser_initbrd()
1738 brd->max_baud = Gpci_uart_info[i].max_baud; in mxser_initbrd()
1740 /* exception....CP-102 */ in mxser_initbrd()
1742 brd->max_baud = 921600; in mxser_initbrd()
1749 outb(0, brd->vector + 4); in mxser_initbrd()
1750 outb(0, brd->vector + 0x0c); in mxser_initbrd()
1753 for (i = 0; i < brd->nports; i++) { in mxser_initbrd()
1754 info = &brd->ports[i]; in mxser_initbrd()
1757 info->opmode_ioaddr = brd->vector + 4; in mxser_initbrd()
1759 info->opmode_ioaddr = brd->vector + 0x0c; in mxser_initbrd()
1761 tty_port_init(&info->port); in mxser_initbrd()
1762 info->port.ops = &mxser_port_ops; in mxser_initbrd()
1763 info->board = brd; in mxser_initbrd()
1766 if (brd->must_hwid != MOXA_OTHER_UART) in mxser_initbrd()
1767 mxser_must_set_enhance_mode(info->ioaddr, true); in mxser_initbrd()
1769 info->type = PORT_16550A; in mxser_initbrd()
1773 spin_lock_init(&info->slock); in mxser_initbrd()
1776 outb(inb(info->ioaddr + UART_IER) & 0xf0, in mxser_initbrd()
1777 info->ioaddr + UART_IER); in mxser_initbrd()
1787 unsigned short nports = MXSER_NPORTS(ent->driver_data); in mxser_probe()
1789 int retval = -EINVAL; in mxser_probe()
1793 dev_err(&pdev->dev, "too many boards found (maximum %d), board " in mxser_probe()
1798 brd = devm_kzalloc(&pdev->dev, struct_size(brd, ports, nports), in mxser_probe()
1803 brd->idx = i; in mxser_probe()
1804 __set_bit(brd->idx, mxser_boards); in mxser_probe()
1809 dev_err(&pdev->dev, "PCI enable failed\n"); in mxser_probe()
1819 brd->nports = nports; in mxser_probe()
1821 brd->ports[i].ioaddr = ioaddress + 8 * i; in mxser_probe()
1828 brd->vector = ioaddress; in mxser_probe()
1831 brd->irq = pdev->irq; in mxser_probe()
1833 mxser_initbrd(brd, ent->driver_data & MXSER_HIGHBAUD); in mxser_probe()
1835 retval = devm_request_irq(&pdev->dev, brd->irq, mxser_interrupt, in mxser_probe()
1838 dev_err(&pdev->dev, "request irq failed"); in mxser_probe()
1843 tty_dev = tty_port_register_device(&brd->ports[i].port, in mxser_probe()
1844 mxvar_sdriver, base + i, &pdev->dev); in mxser_probe()
1847 for (; i > 0; i--) in mxser_probe()
1849 base + i - 1); in mxser_probe()
1859 tty_port_destroy(&brd->ports[i].port); in mxser_probe()
1861 __clear_bit(brd->idx, mxser_boards); in mxser_probe()
1869 unsigned int i, base = brd->idx * MXSER_PORTS_PER_BOARD; in mxser_remove()
1871 for (i = 0; i < brd->nports; i++) { in mxser_remove()
1873 tty_port_destroy(&brd->ports[i].port); in mxser_remove()
1876 __clear_bit(brd->idx, mxser_boards); in mxser_remove()
1896 mxvar_sdriver->name = "ttyMI"; in mxser_module_init()
1897 mxvar_sdriver->major = ttymajor; in mxser_module_init()
1898 mxvar_sdriver->minor_start = 0; in mxser_module_init()
1899 mxvar_sdriver->type = TTY_DRIVER_TYPE_SERIAL; in mxser_module_init()
1900 mxvar_sdriver->subtype = SERIAL_TYPE_NORMAL; in mxser_module_init()
1901 mxvar_sdriver->init_termios = tty_std_termios; in mxser_module_init()
1902 mxvar_sdriver->init_termios.c_cflag = B9600|CS8|CREAD|HUPCL|CLOCAL; in mxser_module_init()