Lines Matching +full:overrun +full:- +full:throttle +full:- +full:ms
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
45 * Semi-public control interfaces
62 /* --------------------------------------------------- */
339 u8 oldlcr = mxser_must_select_bank(info->ioaddr, MOXA_MUST_EFR_BANK1); in mxser_set_must_fifo_value()
340 outb(info->rx_high_water, info->ioaddr + MOXA_MUST_RBRTH_REGISTER); in mxser_set_must_fifo_value()
341 outb(info->rx_high_water, info->ioaddr + MOXA_MUST_RBRTI_REGISTER); in mxser_set_must_fifo_value()
342 outb(info->rx_low_water, info->ioaddr + MOXA_MUST_RBRTL_REGISTER); in mxser_set_must_fifo_value()
343 outb(oldlcr, info->ioaddr + UART_LCR); in mxser_set_must_fifo_value()
416 return info->type == PORT_16550A || info->board->must_hwid; in mxser_16550A_or_MUST()
423 if (info->type == PORT_16450 || info->type == PORT_8250) { in mxser_process_txrx_fifo()
424 info->rx_high_water = 1; in mxser_process_txrx_fifo()
425 info->rx_low_water = 1; in mxser_process_txrx_fifo()
426 info->xmit_fifo_size = 1; in mxser_process_txrx_fifo()
431 if (info->board->must_hwid == Gpci_uart_info[i].type) { in mxser_process_txrx_fifo()
432 info->rx_low_water = Gpci_uart_info[i].rx_low_water; in mxser_process_txrx_fifo()
433 info->rx_high_water = Gpci_uart_info[i].rx_high_water; in mxser_process_txrx_fifo()
434 info->xmit_fifo_size = Gpci_uart_info[i].fifo_size; in mxser_process_txrx_fifo()
441 outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER); in __mxser_start_tx()
442 info->IER |= UART_IER_THRI; in __mxser_start_tx()
443 outb(info->IER, info->ioaddr + UART_IER); in __mxser_start_tx()
450 spin_lock_irqsave(&info->slock, flags); in mxser_start_tx()
452 spin_unlock_irqrestore(&info->slock, flags); in mxser_start_tx()
457 info->IER &= ~UART_IER_THRI; in __mxser_stop_tx()
458 outb(info->IER, info->ioaddr + UART_IER); in __mxser_stop_tx()
464 return (inb(mp->ioaddr + UART_MSR) & UART_MSR_DCD)?1:0; in mxser_carrier_raised()
473 spin_lock_irqsave(&mp->slock, flags); in mxser_dtr_rts()
474 mcr = inb(mp->ioaddr + UART_MCR); in mxser_dtr_rts()
479 outb(mcr, mp->ioaddr + UART_MCR); in mxser_dtr_rts()
480 spin_unlock_irqrestore(&mp->slock, flags); in mxser_dtr_rts()
485 struct mxser_port *info = tty->driver_data; in mxser_set_baud()
490 if (newspd > info->board->max_baud) in mxser_set_baud()
491 return -1; in mxser_set_baud()
510 timeout = (u64)info->xmit_fifo_size * HZ * 10 * quot; in mxser_set_baud()
512 info->timeout = timeout + HZ / 50; /* Add .02 seconds of slop */ in mxser_set_baud()
515 info->MCR |= UART_MCR_DTR; in mxser_set_baud()
516 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_set_baud()
518 info->MCR &= ~UART_MCR_DTR; in mxser_set_baud()
519 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_set_baud()
523 cval = inb(info->ioaddr + UART_LCR); in mxser_set_baud()
525 outb(cval | UART_LCR_DLAB, info->ioaddr + UART_LCR); /* set DLAB */ in mxser_set_baud()
527 outb(quot & 0xff, info->ioaddr + UART_DLL); /* LS of divisor */ in mxser_set_baud()
528 outb(quot >> 8, info->ioaddr + UART_DLM); /* MS of divisor */ in mxser_set_baud()
529 outb(cval, info->ioaddr + UART_LCR); /* reset DLAB */ in mxser_set_baud()
540 mxser_set_must_enum_value(info->ioaddr, quot); in mxser_set_baud()
542 mxser_set_must_enum_value(info->ioaddr, 0); in mxser_set_baud()
553 if (tty->hw_stopped) { in mxser_handle_cts()
555 tty->hw_stopped = 0; in mxser_handle_cts()
565 tty->hw_stopped = 1; in mxser_handle_cts()
577 struct mxser_port *info = tty->driver_data; in mxser_change_speed()
580 cflag = tty->termios.c_cflag; in mxser_change_speed()
591 cval = UART_LCR_WLEN(tty_get_char_size(tty->termios.c_cflag)); in mxser_change_speed()
602 info->FCR = 0; in mxser_change_speed()
603 if (info->board->must_hwid) { in mxser_change_speed()
604 info->FCR |= UART_FCR_ENABLE_FIFO | in mxser_change_speed()
607 } else if (info->type != PORT_8250 && info->type != PORT_16450) { in mxser_change_speed()
608 info->FCR |= UART_FCR_ENABLE_FIFO; in mxser_change_speed()
609 switch (info->rx_high_water) { in mxser_change_speed()
611 info->FCR |= UART_FCR_TRIGGER_1; in mxser_change_speed()
614 info->FCR |= UART_FCR_TRIGGER_4; in mxser_change_speed()
617 info->FCR |= UART_FCR_TRIGGER_8; in mxser_change_speed()
620 info->FCR |= UART_FCR_TRIGGER_14; in mxser_change_speed()
626 info->IER &= ~UART_IER_MSI; in mxser_change_speed()
627 info->MCR &= ~UART_MCR_AFE; in mxser_change_speed()
628 tty_port_set_cts_flow(&info->port, cflag & CRTSCTS); in mxser_change_speed()
630 info->IER |= UART_IER_MSI; in mxser_change_speed()
632 info->MCR |= UART_MCR_AFE; in mxser_change_speed()
635 inb(info->ioaddr + UART_MSR)); in mxser_change_speed()
638 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_change_speed()
639 tty_port_set_check_carrier(&info->port, ~cflag & CLOCAL); in mxser_change_speed()
641 info->IER |= UART_IER_MSI; in mxser_change_speed()
642 outb(info->IER, info->ioaddr + UART_IER); in mxser_change_speed()
647 info->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; in mxser_change_speed()
649 info->read_status_mask |= UART_LSR_FE | UART_LSR_PE; in mxser_change_speed()
651 info->read_status_mask |= UART_LSR_BI; in mxser_change_speed()
653 info->ignore_status_mask = 0; in mxser_change_speed()
656 info->ignore_status_mask |= UART_LSR_BI; in mxser_change_speed()
657 info->read_status_mask |= UART_LSR_BI; in mxser_change_speed()
663 info->ignore_status_mask |= in mxser_change_speed()
667 info->read_status_mask |= in mxser_change_speed()
673 if (info->board->must_hwid) { in mxser_change_speed()
674 mxser_set_must_xon1_value(info->ioaddr, START_CHAR(tty)); in mxser_change_speed()
675 mxser_set_must_xoff1_value(info->ioaddr, STOP_CHAR(tty)); in mxser_change_speed()
676 mxser_must_set_rx_sw_flow_control(info->ioaddr, I_IXON(tty)); in mxser_change_speed()
677 mxser_must_set_tx_sw_flow_control(info->ioaddr, I_IXOFF(tty)); in mxser_change_speed()
681 outb(info->FCR, info->ioaddr + UART_FCR); in mxser_change_speed()
682 outb(cval, info->ioaddr + UART_LCR); in mxser_change_speed()
688 u8 msr = inb(port->ioaddr + UART_MSR); in mxser_check_modem_status()
695 port->icount.rng++; in mxser_check_modem_status()
697 port->icount.dsr++; in mxser_check_modem_status()
699 port->icount.dcd++; in mxser_check_modem_status()
701 port->icount.cts++; in mxser_check_modem_status()
702 wake_up_interruptible(&port->port.delta_msr_wait); in mxser_check_modem_status()
704 if (tty_port_check_carrier(&port->port) && (msr & UART_MSR_DDCD)) { in mxser_check_modem_status()
706 wake_up_interruptible(&port->port.open_wait); in mxser_check_modem_status()
709 if (tty_port_cts_enabled(&port->port)) in mxser_check_modem_status()
719 if (info->board->must_hwid) in mxser_disable_and_clear_FIFO()
722 outb(fcr, info->ioaddr + UART_FCR); in mxser_disable_and_clear_FIFO()
735 spin_lock_irqsave(&info->slock, flags); in mxser_activate()
737 if (!info->type) { in mxser_activate()
738 set_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
739 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
755 if (inb(info->ioaddr + UART_LSR) == 0xff) { in mxser_activate()
756 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
758 set_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
762 ret = -ENODEV; in mxser_activate()
769 (void) inb(info->ioaddr + UART_LSR); in mxser_activate()
770 (void) inb(info->ioaddr + UART_RX); in mxser_activate()
771 (void) inb(info->ioaddr + UART_IIR); in mxser_activate()
772 (void) inb(info->ioaddr + UART_MSR); in mxser_activate()
777 outb(UART_LCR_WLEN8, info->ioaddr + UART_LCR); /* reset DLAB */ in mxser_activate()
778 info->MCR = UART_MCR_DTR | UART_MCR_RTS; in mxser_activate()
779 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_activate()
784 info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; in mxser_activate()
786 if (info->board->must_hwid) in mxser_activate()
787 info->IER |= MOXA_MUST_IER_EGDAI; in mxser_activate()
788 outb(info->IER, info->ioaddr + UART_IER); /* enable interrupts */ in mxser_activate()
793 (void) inb(info->ioaddr + UART_LSR); in mxser_activate()
794 (void) inb(info->ioaddr + UART_RX); in mxser_activate()
795 (void) inb(info->ioaddr + UART_IIR); in mxser_activate()
796 (void) inb(info->ioaddr + UART_MSR); in mxser_activate()
798 clear_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
799 kfifo_reset(&port->xmit_fifo); in mxser_activate()
805 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
820 info->IER &= ~UART_IER_RLSI; in mxser_stop_rx()
821 if (info->board->must_hwid) in mxser_stop_rx()
822 info->IER &= ~MOXA_MUST_RECV_ISR; in mxser_stop_rx()
824 outb(info->IER, info->ioaddr + UART_IER); in mxser_stop_rx()
835 spin_lock_irqsave(&info->slock, flags); in mxser_shutdown_port()
843 wake_up_interruptible(&info->port.delta_msr_wait); in mxser_shutdown_port()
845 info->IER = 0; in mxser_shutdown_port()
846 outb(0x00, info->ioaddr + UART_IER); in mxser_shutdown_port()
852 (void) inb(info->ioaddr + UART_RX); in mxser_shutdown_port()
855 if (info->board->must_hwid) in mxser_shutdown_port()
856 mxser_must_no_sw_flow_control(info->ioaddr); in mxser_shutdown_port()
858 spin_unlock_irqrestore(&info->slock, flags); in mxser_shutdown_port()
861 synchronize_irq(info->board->irq); in mxser_shutdown_port()
869 * the IRQ chain. It also performs the serial-specific
874 struct tty_port *tport = tty->port; in mxser_open()
877 tty->driver_data = port; in mxser_open()
884 struct mxser_port *info = tty->driver_data; in mxser_flush_buffer()
887 spin_lock_irqsave(&info->slock, flags); in mxser_flush_buffer()
888 kfifo_reset(&info->port.xmit_fifo); in mxser_flush_buffer()
890 outb(info->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, in mxser_flush_buffer()
891 info->ioaddr + UART_FCR); in mxser_flush_buffer()
893 spin_unlock_irqrestore(&info->slock, flags); in mxser_flush_buffer()
900 tty_port_close(tty->port, tty, filp); in mxser_close()
905 struct mxser_port *info = tty->driver_data; in mxser_write()
910 spin_lock_irqsave(&info->slock, flags); in mxser_write()
911 written = kfifo_in(&info->port.xmit_fifo, buf, count); in mxser_write()
912 is_empty = kfifo_is_empty(&info->port.xmit_fifo); in mxser_write()
913 spin_unlock_irqrestore(&info->slock, flags); in mxser_write()
915 if (!is_empty && !tty->flow.stopped) in mxser_write()
916 if (!tty->hw_stopped || mxser_16550A_or_MUST(info)) in mxser_write()
924 struct mxser_port *info = tty->driver_data; in mxser_put_char()
928 spin_lock_irqsave(&info->slock, flags); in mxser_put_char()
929 ret = kfifo_put(&info->port.xmit_fifo, ch); in mxser_put_char()
930 spin_unlock_irqrestore(&info->slock, flags); in mxser_put_char()
938 struct mxser_port *info = tty->driver_data; in mxser_flush_chars()
940 if (kfifo_is_empty(&info->port.xmit_fifo) || tty->flow.stopped || in mxser_flush_chars()
941 (tty->hw_stopped && !mxser_16550A_or_MUST(info))) in mxser_flush_chars()
949 struct mxser_port *info = tty->driver_data; in mxser_write_room()
951 return kfifo_avail(&info->port.xmit_fifo); in mxser_write_room()
956 struct mxser_port *info = tty->driver_data; in mxser_chars_in_buffer()
958 return kfifo_len(&info->port.xmit_fifo); in mxser_chars_in_buffer()
962 * ------------------------------------------------------------
964 * ------------------------------------------------------------
969 struct mxser_port *info = tty->driver_data; in mxser_get_serial_info()
970 struct tty_port *port = &info->port; in mxser_get_serial_info()
973 mutex_lock(&port->mutex); in mxser_get_serial_info()
975 close_delay = jiffies_to_msecs(info->port.close_delay) / 10; in mxser_get_serial_info()
976 closing_wait = info->port.closing_wait; in mxser_get_serial_info()
980 ss->type = info->type; in mxser_get_serial_info()
981 ss->line = tty->index; in mxser_get_serial_info()
982 ss->port = info->ioaddr; in mxser_get_serial_info()
983 ss->irq = info->board->irq; in mxser_get_serial_info()
984 ss->flags = info->port.flags; in mxser_get_serial_info()
985 ss->baud_base = MXSER_BAUD_BASE; in mxser_get_serial_info()
986 ss->close_delay = close_delay; in mxser_get_serial_info()
987 ss->closing_wait = closing_wait; in mxser_get_serial_info()
988 ss->custom_divisor = MXSER_CUSTOM_DIVISOR, in mxser_get_serial_info()
989 mutex_unlock(&port->mutex); in mxser_get_serial_info()
996 struct mxser_port *info = tty->driver_data; in mxser_set_serial_info()
997 struct tty_port *port = &info->port; in mxser_set_serial_info()
1004 return -EIO; in mxser_set_serial_info()
1006 mutex_lock(&port->mutex); in mxser_set_serial_info()
1008 if (ss->irq != info->board->irq || in mxser_set_serial_info()
1009 ss->port != info->ioaddr) { in mxser_set_serial_info()
1010 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1011 return -EINVAL; in mxser_set_serial_info()
1014 old_speed = port->flags & ASYNC_SPD_MASK; in mxser_set_serial_info()
1016 close_delay = msecs_to_jiffies(ss->close_delay * 10); in mxser_set_serial_info()
1017 closing_wait = ss->closing_wait; in mxser_set_serial_info()
1022 if ((ss->baud_base != MXSER_BAUD_BASE) || in mxser_set_serial_info()
1023 (close_delay != port->close_delay) || in mxser_set_serial_info()
1024 (closing_wait != port->closing_wait) || in mxser_set_serial_info()
1025 ((ss->flags & ~ASYNC_USR_MASK) != (port->flags & ~ASYNC_USR_MASK))) { in mxser_set_serial_info()
1026 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1027 return -EPERM; in mxser_set_serial_info()
1029 port->flags = (port->flags & ~ASYNC_USR_MASK) | in mxser_set_serial_info()
1030 (ss->flags & ASYNC_USR_MASK); in mxser_set_serial_info()
1036 port->flags = ((port->flags & ~ASYNC_FLAGS) | in mxser_set_serial_info()
1037 (ss->flags & ASYNC_FLAGS)); in mxser_set_serial_info()
1038 port->close_delay = close_delay; in mxser_set_serial_info()
1039 port->closing_wait = closing_wait; in mxser_set_serial_info()
1040 if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST && in mxser_set_serial_info()
1041 (ss->baud_base != MXSER_BAUD_BASE || in mxser_set_serial_info()
1042 ss->custom_divisor != in mxser_set_serial_info()
1044 if (ss->custom_divisor == 0) { in mxser_set_serial_info()
1045 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1046 return -EINVAL; in mxser_set_serial_info()
1048 baud = ss->baud_base / ss->custom_divisor; in mxser_set_serial_info()
1052 info->type = ss->type; in mxser_set_serial_info()
1058 if (old_speed != (port->flags & ASYNC_SPD_MASK)) { in mxser_set_serial_info()
1059 spin_lock_irqsave(&info->slock, sl_flags); in mxser_set_serial_info()
1061 spin_unlock_irqrestore(&info->slock, sl_flags); in mxser_set_serial_info()
1068 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1073 * mxser_get_lsr_info - get line status register info
1089 spin_lock_irqsave(&info->slock, flags); in mxser_get_lsr_info()
1090 status = inb(info->ioaddr + UART_LSR); in mxser_get_lsr_info()
1091 spin_unlock_irqrestore(&info->slock, flags); in mxser_get_lsr_info()
1098 struct mxser_port *info = tty->driver_data; in mxser_tiocmget()
1104 return -EIO; in mxser_tiocmget()
1106 spin_lock_irqsave(&info->slock, flags); in mxser_tiocmget()
1107 control = info->MCR; in mxser_tiocmget()
1109 spin_unlock_irqrestore(&info->slock, flags); in mxser_tiocmget()
1122 struct mxser_port *info = tty->driver_data; in mxser_tiocmset()
1126 return -EIO; in mxser_tiocmset()
1128 spin_lock_irqsave(&info->slock, flags); in mxser_tiocmset()
1131 info->MCR |= UART_MCR_RTS; in mxser_tiocmset()
1133 info->MCR |= UART_MCR_DTR; in mxser_tiocmset()
1136 info->MCR &= ~UART_MCR_RTS; in mxser_tiocmset()
1138 info->MCR &= ~UART_MCR_DTR; in mxser_tiocmset()
1140 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_tiocmset()
1141 spin_unlock_irqrestore(&info->slock, flags); in mxser_tiocmset()
1152 spin_lock_irqsave(&info->slock, flags); in mxser_cflags_changed()
1153 cnow = info->icount; /* atomic copy */ in mxser_cflags_changed()
1154 spin_unlock_irqrestore(&info->slock, flags); in mxser_cflags_changed()
1156 ret = ((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) || in mxser_cflags_changed()
1157 ((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) || in mxser_cflags_changed()
1158 ((arg & TIOCM_CD) && (cnow.dcd != cprev->dcd)) || in mxser_cflags_changed()
1159 ((arg & TIOCM_CTS) && (cnow.cts != cprev->cts)); in mxser_cflags_changed()
1174 if (port->board->must_hwid != MOXA_MUST_MU860_HWID) in mxser_ioctl_op_mode()
1175 return -EFAULT; in mxser_ioctl_op_mode()
1179 return -EFAULT; in mxser_ioctl_op_mode()
1182 return -EINVAL; in mxser_ioctl_op_mode()
1184 spin_lock_irq(&port->slock); in mxser_ioctl_op_mode()
1185 val = inb(port->opmode_ioaddr); in mxser_ioctl_op_mode()
1188 outb(val, port->opmode_ioaddr); in mxser_ioctl_op_mode()
1189 spin_unlock_irq(&port->slock); in mxser_ioctl_op_mode()
1194 spin_lock_irq(&port->slock); in mxser_ioctl_op_mode()
1195 opmode = inb(port->opmode_ioaddr) >> shiftbit; in mxser_ioctl_op_mode()
1196 spin_unlock_irq(&port->slock); in mxser_ioctl_op_mode()
1204 struct mxser_port *info = tty->driver_data; in mxser_ioctl()
1210 return mxser_ioctl_op_mode(info, tty->index, in mxser_ioctl()
1214 return -EIO; in mxser_ioctl()
1221 * - mask passed in arg for lines of interest in mxser_ioctl()
1226 spin_lock_irqsave(&info->slock, flags); in mxser_ioctl()
1227 cnow = info->icount; /* note the counters on entry */ in mxser_ioctl()
1228 spin_unlock_irqrestore(&info->slock, flags); in mxser_ioctl()
1230 return wait_event_interruptible(info->port.delta_msr_wait, in mxser_ioctl()
1233 return -ENOIOCTLCMD; in mxser_ioctl()
1241 * NB: both 1->0 and 0->1 transitions are counted except for
1242 * RI where only 0->1 is counted.
1249 struct mxser_port *info = tty->driver_data; in mxser_get_icount()
1253 spin_lock_irqsave(&info->slock, flags); in mxser_get_icount()
1254 cnow = info->icount; in mxser_get_icount()
1255 spin_unlock_irqrestore(&info->slock, flags); in mxser_get_icount()
1257 icount->frame = cnow.frame; in mxser_get_icount()
1258 icount->brk = cnow.brk; in mxser_get_icount()
1259 icount->overrun = cnow.overrun; in mxser_get_icount()
1260 icount->buf_overrun = cnow.buf_overrun; in mxser_get_icount()
1261 icount->parity = cnow.parity; in mxser_get_icount()
1262 icount->rx = cnow.rx; in mxser_get_icount()
1263 icount->tx = cnow.tx; in mxser_get_icount()
1264 icount->cts = cnow.cts; in mxser_get_icount()
1265 icount->dsr = cnow.dsr; in mxser_get_icount()
1266 icount->rng = cnow.rng; in mxser_get_icount()
1267 icount->dcd = cnow.dcd; in mxser_get_icount()
1272 * This routine is called by the upper-layer tty layer to signal that
1277 struct mxser_port *info = tty->driver_data; in mxser_throttle()
1280 if (info->board->must_hwid) { in mxser_throttle()
1281 info->IER &= ~MOXA_MUST_RECV_ISR; in mxser_throttle()
1282 outb(info->IER, info->ioaddr + UART_IER); in mxser_throttle()
1284 info->x_char = STOP_CHAR(tty); in mxser_throttle()
1285 outb(0, info->ioaddr + UART_IER); in mxser_throttle()
1286 info->IER |= UART_IER_THRI; in mxser_throttle()
1287 outb(info->IER, info->ioaddr + UART_IER); in mxser_throttle()
1292 info->MCR &= ~UART_MCR_RTS; in mxser_throttle()
1293 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_throttle()
1299 struct mxser_port *info = tty->driver_data; in mxser_unthrottle()
1303 if (info->x_char) in mxser_unthrottle()
1304 info->x_char = 0; in mxser_unthrottle()
1306 if (info->board->must_hwid) { in mxser_unthrottle()
1307 info->IER |= MOXA_MUST_RECV_ISR; in mxser_unthrottle()
1308 outb(info->IER, info->ioaddr + UART_IER); in mxser_unthrottle()
1310 info->x_char = START_CHAR(tty); in mxser_unthrottle()
1311 outb(0, info->ioaddr + UART_IER); in mxser_unthrottle()
1312 info->IER |= UART_IER_THRI; in mxser_unthrottle()
1313 outb(info->IER, info->ioaddr + UART_IER); in mxser_unthrottle()
1319 info->MCR |= UART_MCR_RTS; in mxser_unthrottle()
1320 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_unthrottle()
1327 * This routines are called before setting or resetting tty->flow.stopped.
1332 struct mxser_port *info = tty->driver_data; in mxser_stop()
1335 spin_lock_irqsave(&info->slock, flags); in mxser_stop()
1336 if (info->IER & UART_IER_THRI) in mxser_stop()
1338 spin_unlock_irqrestore(&info->slock, flags); in mxser_stop()
1343 struct mxser_port *info = tty->driver_data; in mxser_start()
1346 spin_lock_irqsave(&info->slock, flags); in mxser_start()
1347 if (!kfifo_is_empty(&info->port.xmit_fifo)) in mxser_start()
1349 spin_unlock_irqrestore(&info->slock, flags); in mxser_start()
1355 struct mxser_port *info = tty->driver_data; in mxser_set_termios()
1358 spin_lock_irqsave(&info->slock, flags); in mxser_set_termios()
1360 spin_unlock_irqrestore(&info->slock, flags); in mxser_set_termios()
1362 if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) { in mxser_set_termios()
1363 tty->hw_stopped = 0; in mxser_set_termios()
1368 if ((old_termios->c_iflag & IXON) && !I_IXON(tty)) { in mxser_set_termios()
1369 tty->flow.stopped = 0; in mxser_set_termios()
1371 if (info->board->must_hwid) { in mxser_set_termios()
1372 spin_lock_irqsave(&info->slock, flags); in mxser_set_termios()
1373 mxser_must_set_rx_sw_flow_control(info->ioaddr, false); in mxser_set_termios()
1374 spin_unlock_irqrestore(&info->slock, flags); in mxser_set_termios()
1386 spin_lock_irqsave(&info->slock, flags); in mxser_tx_empty()
1387 lsr = inb(info->ioaddr + UART_LSR); in mxser_tx_empty()
1388 spin_unlock_irqrestore(&info->slock, flags); in mxser_tx_empty()
1394 * mxser_wait_until_sent() --- wait until the transmitter is empty
1398 struct mxser_port *info = tty->driver_data; in mxser_wait_until_sent()
1401 if (info->type == PORT_UNKNOWN) in mxser_wait_until_sent()
1404 if (info->xmit_fifo_size == 0) in mxser_wait_until_sent()
1413 * the NIST-PCTS. in mxser_wait_until_sent()
1415 char_time = (info->timeout - HZ / 50) / info->xmit_fifo_size; in mxser_wait_until_sent()
1429 * takes longer than info->timeout, this is probably due to a in mxser_wait_until_sent()
1431 * 2*info->timeout. in mxser_wait_until_sent()
1433 if (!timeout || timeout > 2 * info->timeout) in mxser_wait_until_sent()
1434 timeout = 2 * info->timeout; in mxser_wait_until_sent()
1452 struct mxser_port *info = tty->driver_data; in mxser_hangup()
1455 tty_port_hangup(&info->port); in mxser_hangup()
1459 * mxser_rs_break() --- routine which turns the break handling on or off
1463 struct mxser_port *info = tty->driver_data; in mxser_rs_break()
1467 spin_lock_irqsave(&info->slock, flags); in mxser_rs_break()
1468 lcr = inb(info->ioaddr + UART_LCR); in mxser_rs_break()
1469 if (break_state == -1) in mxser_rs_break()
1473 outb(lcr, info->ioaddr + UART_LCR); in mxser_rs_break()
1474 spin_unlock_irqrestore(&info->slock, flags); in mxser_rs_break()
1481 enum mxser_must_hwid hwid = port->board->must_hwid; in mxser_receive_chars_new()
1489 gdl = inb(port->ioaddr + MOXA_MUST_GDL_REGISTER); in mxser_receive_chars_new()
1493 while (gdl--) { in mxser_receive_chars_new()
1494 u8 ch = inb(port->ioaddr + UART_RX); in mxser_receive_chars_new()
1495 if (!tty_insert_flip_char(&port->port, ch, 0)) in mxser_receive_chars_new()
1496 port->icount.buf_overrun++; in mxser_receive_chars_new()
1505 enum mxser_must_hwid hwid = port->board->must_hwid; in mxser_receive_chars_old()
1511 if (max-- < 0) in mxser_receive_chars_old()
1514 ch = inb(port->ioaddr + UART_RX); in mxser_receive_chars_old()
1516 outb(port->FCR | UART_FCR_CLEAR_RCVR, in mxser_receive_chars_old()
1517 port->ioaddr + UART_FCR); in mxser_receive_chars_old()
1518 status &= port->read_status_mask; in mxser_receive_chars_old()
1519 if (status & port->ignore_status_mask) { in mxser_receive_chars_old()
1527 port->icount.brk++; in mxser_receive_chars_old()
1529 if (port->port.flags & ASYNC_SAK) in mxser_receive_chars_old()
1533 port->icount.parity++; in mxser_receive_chars_old()
1536 port->icount.frame++; in mxser_receive_chars_old()
1539 port->icount.overrun++; in mxser_receive_chars_old()
1542 if (!tty_insert_flip_char(&port->port, ch, flag)) { in mxser_receive_chars_old()
1543 port->icount.buf_overrun++; in mxser_receive_chars_old()
1551 status = inb(port->ioaddr + UART_LSR); in mxser_receive_chars_old()
1563 tty_flip_buffer_push(&port->port); in mxser_receive_chars()
1572 if (port->x_char) { in mxser_transmit_chars()
1573 outb(port->x_char, port->ioaddr + UART_TX); in mxser_transmit_chars()
1574 port->x_char = 0; in mxser_transmit_chars()
1575 port->icount.tx++; in mxser_transmit_chars()
1579 if (kfifo_is_empty(&port->port.xmit_fifo) || tty->flow.stopped || in mxser_transmit_chars()
1580 (tty->hw_stopped && !mxser_16550A_or_MUST(port))) { in mxser_transmit_chars()
1585 count = port->xmit_fifo_size; in mxser_transmit_chars()
1589 if (!kfifo_get(&port->port.xmit_fifo, &c)) in mxser_transmit_chars()
1592 outb(c, port->ioaddr + UART_TX); in mxser_transmit_chars()
1593 port->icount.tx++; in mxser_transmit_chars()
1594 } while (--count > 0); in mxser_transmit_chars()
1596 if (kfifo_len(&port->port.xmit_fifo) < WAKEUP_CHARS) in mxser_transmit_chars()
1599 if (kfifo_is_empty(&port->port.xmit_fifo)) in mxser_transmit_chars()
1609 iir = inb(port->ioaddr + UART_IIR); in mxser_port_isr()
1614 tty = tty_port_tty_get(&port->port); in mxser_port_isr()
1616 status = inb(port->ioaddr + UART_LSR); in mxser_port_isr()
1617 outb(port->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, in mxser_port_isr()
1618 port->ioaddr + UART_FCR); in mxser_port_isr()
1619 inb(port->ioaddr + UART_MSR); in mxser_port_isr()
1625 status = inb(port->ioaddr + UART_LSR); in mxser_port_isr()
1627 if (port->board->must_hwid) { in mxser_port_isr()
1634 status &= port->read_status_mask; in mxser_port_isr()
1641 if (port->board->must_hwid) { in mxser_port_isr()
1663 unsigned int i, max = brd->nports; in mxser_interrupt()
1665 u8 irqbits, bits, mask = BIT(max) - 1; in mxser_interrupt()
1668 irqbits = inb(brd->vector) & mask; in mxser_interrupt()
1678 port = &brd->ports[i]; in mxser_interrupt()
1681 spin_lock(&port->slock); in mxser_interrupt()
1686 spin_unlock(&port->slock); in mxser_interrupt()
1703 .throttle = mxser_throttle,
1726 * The MOXA Smartio/Industio serial driver boot-time initialization code!
1735 brd->must_hwid = mxser_must_get_hwid(brd->ports[0].ioaddr); in mxser_initbrd()
1736 is_mu860 = brd->must_hwid == MOXA_MUST_MU860_HWID; in mxser_initbrd()
1739 if (Gpci_uart_info[i].type == brd->must_hwid) { in mxser_initbrd()
1740 brd->max_baud = Gpci_uart_info[i].max_baud; in mxser_initbrd()
1742 /* exception....CP-102 */ in mxser_initbrd()
1744 brd->max_baud = 921600; in mxser_initbrd()
1751 outb(0, brd->vector + 4); in mxser_initbrd()
1752 outb(0, brd->vector + 0x0c); in mxser_initbrd()
1755 for (i = 0; i < brd->nports; i++) { in mxser_initbrd()
1756 info = &brd->ports[i]; in mxser_initbrd()
1759 info->opmode_ioaddr = brd->vector + 4; in mxser_initbrd()
1761 info->opmode_ioaddr = brd->vector + 0x0c; in mxser_initbrd()
1763 tty_port_init(&info->port); in mxser_initbrd()
1764 info->port.ops = &mxser_port_ops; in mxser_initbrd()
1765 info->board = brd; in mxser_initbrd()
1768 if (brd->must_hwid != MOXA_OTHER_UART) in mxser_initbrd()
1769 mxser_must_set_enhance_mode(info->ioaddr, true); in mxser_initbrd()
1771 info->type = PORT_16550A; in mxser_initbrd()
1775 info->port.close_delay = 5 * HZ / 10; in mxser_initbrd()
1776 info->port.closing_wait = 30 * HZ; in mxser_initbrd()
1777 spin_lock_init(&info->slock); in mxser_initbrd()
1780 outb(inb(info->ioaddr + UART_IER) & 0xf0, in mxser_initbrd()
1781 info->ioaddr + UART_IER); in mxser_initbrd()
1791 unsigned short nports = MXSER_NPORTS(ent->driver_data); in mxser_probe()
1793 int retval = -EINVAL; in mxser_probe()
1797 dev_err(&pdev->dev, "too many boards found (maximum %d), board " in mxser_probe()
1802 brd = devm_kzalloc(&pdev->dev, struct_size(brd, ports, nports), in mxser_probe()
1807 brd->idx = i; in mxser_probe()
1808 __set_bit(brd->idx, mxser_boards); in mxser_probe()
1813 dev_err(&pdev->dev, "PCI enable failed\n"); in mxser_probe()
1823 brd->nports = nports; in mxser_probe()
1825 brd->ports[i].ioaddr = ioaddress + 8 * i; in mxser_probe()
1832 brd->vector = ioaddress; in mxser_probe()
1835 brd->irq = pdev->irq; in mxser_probe()
1837 mxser_initbrd(brd, ent->driver_data & MXSER_HIGHBAUD); in mxser_probe()
1839 retval = devm_request_irq(&pdev->dev, brd->irq, mxser_interrupt, in mxser_probe()
1842 dev_err(&pdev->dev, "request irq failed"); in mxser_probe()
1847 tty_dev = tty_port_register_device(&brd->ports[i].port, in mxser_probe()
1848 mxvar_sdriver, base + i, &pdev->dev); in mxser_probe()
1851 for (; i > 0; i--) in mxser_probe()
1853 base + i - 1); in mxser_probe()
1863 tty_port_destroy(&brd->ports[i].port); in mxser_probe()
1865 __clear_bit(brd->idx, mxser_boards); in mxser_probe()
1873 unsigned int i, base = brd->idx * MXSER_PORTS_PER_BOARD; in mxser_remove()
1875 for (i = 0; i < brd->nports; i++) { in mxser_remove()
1877 tty_port_destroy(&brd->ports[i].port); in mxser_remove()
1880 __clear_bit(brd->idx, mxser_boards); in mxser_remove()
1900 mxvar_sdriver->name = "ttyMI"; in mxser_module_init()
1901 mxvar_sdriver->major = ttymajor; in mxser_module_init()
1902 mxvar_sdriver->minor_start = 0; in mxser_module_init()
1903 mxvar_sdriver->type = TTY_DRIVER_TYPE_SERIAL; in mxser_module_init()
1904 mxvar_sdriver->subtype = SERIAL_TYPE_NORMAL; in mxser_module_init()
1905 mxvar_sdriver->init_termios = tty_std_termios; in mxser_module_init()
1906 mxvar_sdriver->init_termios.c_cflag = B9600|CS8|CREAD|HUPCL|CLOCAL; in mxser_module_init()