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 /* --------------------------------------------------- */
326 u8 oldlcr = mxser_must_select_bank(info->ioaddr, MOXA_MUST_EFR_BANK1); in mxser_set_must_fifo_value()
327 outb(info->rx_high_water, info->ioaddr + MOXA_MUST_RBRTH_REGISTER); in mxser_set_must_fifo_value()
328 outb(info->rx_high_water, info->ioaddr + MOXA_MUST_RBRTI_REGISTER); in mxser_set_must_fifo_value()
329 outb(info->rx_low_water, info->ioaddr + MOXA_MUST_RBRTL_REGISTER); in mxser_set_must_fifo_value()
330 outb(oldlcr, info->ioaddr + UART_LCR); in mxser_set_must_fifo_value()
403 return info->type == PORT_16550A || info->board->must_hwid; in mxser_16550A_or_MUST()
410 if (info->type == PORT_16450 || info->type == PORT_8250) { in mxser_process_txrx_fifo()
411 info->rx_high_water = 1; in mxser_process_txrx_fifo()
412 info->rx_low_water = 1; in mxser_process_txrx_fifo()
413 info->xmit_fifo_size = 1; in mxser_process_txrx_fifo()
418 if (info->board->must_hwid == Gpci_uart_info[i].type) { in mxser_process_txrx_fifo()
419 info->rx_low_water = Gpci_uart_info[i].rx_low_water; in mxser_process_txrx_fifo()
420 info->rx_high_water = Gpci_uart_info[i].rx_high_water; in mxser_process_txrx_fifo()
421 info->xmit_fifo_size = Gpci_uart_info[i].fifo_size; in mxser_process_txrx_fifo()
428 outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER); in __mxser_start_tx()
429 info->IER |= UART_IER_THRI; in __mxser_start_tx()
430 outb(info->IER, info->ioaddr + UART_IER); in __mxser_start_tx()
437 spin_lock_irqsave(&info->slock, flags); in mxser_start_tx()
439 spin_unlock_irqrestore(&info->slock, flags); in mxser_start_tx()
444 info->IER &= ~UART_IER_THRI; in __mxser_stop_tx()
445 outb(info->IER, info->ioaddr + UART_IER); in __mxser_stop_tx()
451 return (inb(mp->ioaddr + UART_MSR) & UART_MSR_DCD)?1:0; in mxser_carrier_raised()
460 spin_lock_irqsave(&mp->slock, flags); in mxser_dtr_rts()
461 mcr = inb(mp->ioaddr + UART_MCR); in mxser_dtr_rts()
466 outb(mcr, mp->ioaddr + UART_MCR); in mxser_dtr_rts()
467 spin_unlock_irqrestore(&mp->slock, flags); in mxser_dtr_rts()
472 struct mxser_port *info = tty->driver_data; in mxser_set_baud()
477 if (newspd > info->board->max_baud) in mxser_set_baud()
478 return -1; in mxser_set_baud()
497 timeout = (u64)info->xmit_fifo_size * HZ * 10 * quot; in mxser_set_baud()
499 info->timeout = timeout + HZ / 50; /* Add .02 seconds of slop */ in mxser_set_baud()
502 info->MCR |= UART_MCR_DTR; in mxser_set_baud()
503 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_set_baud()
505 info->MCR &= ~UART_MCR_DTR; in mxser_set_baud()
506 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_set_baud()
510 cval = inb(info->ioaddr + UART_LCR); in mxser_set_baud()
512 outb(cval | UART_LCR_DLAB, info->ioaddr + UART_LCR); /* set DLAB */ in mxser_set_baud()
514 outb(quot & 0xff, info->ioaddr + UART_DLL); /* LS of divisor */ in mxser_set_baud()
515 outb(quot >> 8, info->ioaddr + UART_DLM); /* MS of divisor */ in mxser_set_baud()
516 outb(cval, info->ioaddr + UART_LCR); /* reset DLAB */ in mxser_set_baud()
528 mxser_set_must_enum_value(info->ioaddr, quot); in mxser_set_baud()
531 mxser_set_must_enum_value(info->ioaddr, 0); in mxser_set_baud()
541 if (tty->hw_stopped) { in mxser_handle_cts()
543 tty->hw_stopped = 0; in mxser_handle_cts()
553 tty->hw_stopped = 1; in mxser_handle_cts()
564 struct mxser_port *info = tty->driver_data; in mxser_change_speed()
567 cflag = tty->termios.c_cflag; in mxser_change_speed()
597 if ((info->type == PORT_8250) || (info->type == PORT_16450)) { in mxser_change_speed()
598 if (info->board->must_hwid) { in mxser_change_speed()
606 if (info->board->must_hwid) { in mxser_change_speed()
610 switch (info->rx_high_water) { in mxser_change_speed()
628 info->IER &= ~UART_IER_MSI; in mxser_change_speed()
629 info->MCR &= ~UART_MCR_AFE; in mxser_change_speed()
630 tty_port_set_cts_flow(&info->port, cflag & CRTSCTS); in mxser_change_speed()
632 info->IER |= UART_IER_MSI; in mxser_change_speed()
634 info->MCR |= UART_MCR_AFE; in mxser_change_speed()
637 inb(info->ioaddr + UART_MSR)); in mxser_change_speed()
640 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_change_speed()
641 tty_port_set_check_carrier(&info->port, ~cflag & CLOCAL); in mxser_change_speed()
643 info->IER |= UART_IER_MSI; in mxser_change_speed()
644 outb(info->IER, info->ioaddr + UART_IER); in mxser_change_speed()
649 info->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; in mxser_change_speed()
651 info->read_status_mask |= UART_LSR_FE | UART_LSR_PE; in mxser_change_speed()
653 info->read_status_mask |= UART_LSR_BI; in mxser_change_speed()
655 info->ignore_status_mask = 0; in mxser_change_speed()
658 info->ignore_status_mask |= UART_LSR_BI; in mxser_change_speed()
659 info->read_status_mask |= UART_LSR_BI; in mxser_change_speed()
665 info->ignore_status_mask |= in mxser_change_speed()
669 info->read_status_mask |= in mxser_change_speed()
675 if (info->board->must_hwid) { in mxser_change_speed()
676 mxser_set_must_xon1_value(info->ioaddr, START_CHAR(tty)); in mxser_change_speed()
677 mxser_set_must_xoff1_value(info->ioaddr, STOP_CHAR(tty)); in mxser_change_speed()
678 mxser_must_set_rx_sw_flow_control(info->ioaddr, I_IXON(tty)); in mxser_change_speed()
679 mxser_must_set_tx_sw_flow_control(info->ioaddr, I_IXOFF(tty)); in mxser_change_speed()
683 outb(fcr, info->ioaddr + UART_FCR); /* set fcr */ in mxser_change_speed()
684 outb(cval, info->ioaddr + UART_LCR); in mxser_change_speed()
692 port->icount.rng++; in mxser_check_modem_status()
694 port->icount.dsr++; in mxser_check_modem_status()
696 port->icount.dcd++; in mxser_check_modem_status()
698 port->icount.cts++; in mxser_check_modem_status()
699 wake_up_interruptible(&port->port.delta_msr_wait); in mxser_check_modem_status()
701 if (tty_port_check_carrier(&port->port) && (status & UART_MSR_DDCD)) { in mxser_check_modem_status()
703 wake_up_interruptible(&port->port.open_wait); in mxser_check_modem_status()
706 if (tty_port_cts_enabled(&port->port)) in mxser_check_modem_status()
718 return -ENOMEM; in mxser_activate()
720 spin_lock_irqsave(&info->slock, flags); in mxser_activate()
722 if (!info->type) { in mxser_activate()
723 set_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
725 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
728 info->port.xmit_buf = (unsigned char *) page; in mxser_activate()
734 if (info->board->must_hwid) in mxser_activate()
737 MOXA_MUST_FCR_GDA_MODE_ENABLE), info->ioaddr + UART_FCR); in mxser_activate()
740 info->ioaddr + UART_FCR); in mxser_activate()
747 if (inb(info->ioaddr + UART_LSR) == 0xff) { in mxser_activate()
748 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
750 set_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
753 return -ENODEV; in mxser_activate()
759 (void) inb(info->ioaddr + UART_LSR); in mxser_activate()
760 (void) inb(info->ioaddr + UART_RX); in mxser_activate()
761 (void) inb(info->ioaddr + UART_IIR); in mxser_activate()
762 (void) inb(info->ioaddr + UART_MSR); in mxser_activate()
767 outb(UART_LCR_WLEN8, info->ioaddr + UART_LCR); /* reset DLAB */ in mxser_activate()
768 info->MCR = UART_MCR_DTR | UART_MCR_RTS; in mxser_activate()
769 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_activate()
774 info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; in mxser_activate()
776 if (info->board->must_hwid) in mxser_activate()
777 info->IER |= MOXA_MUST_IER_EGDAI; in mxser_activate()
778 outb(info->IER, info->ioaddr + UART_IER); /* enable interrupts */ in mxser_activate()
783 (void) inb(info->ioaddr + UART_LSR); in mxser_activate()
784 (void) inb(info->ioaddr + UART_RX); in mxser_activate()
785 (void) inb(info->ioaddr + UART_IIR); in mxser_activate()
786 (void) inb(info->ioaddr + UART_MSR); in mxser_activate()
788 clear_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
789 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; in mxser_activate()
795 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
808 spin_lock_irqsave(&info->slock, flags); in mxser_shutdown_port()
814 wake_up_interruptible(&info->port.delta_msr_wait); in mxser_shutdown_port()
819 if (info->port.xmit_buf) { in mxser_shutdown_port()
820 free_page((unsigned long) info->port.xmit_buf); in mxser_shutdown_port()
821 info->port.xmit_buf = NULL; in mxser_shutdown_port()
824 info->IER = 0; in mxser_shutdown_port()
825 outb(0x00, info->ioaddr + UART_IER); in mxser_shutdown_port()
828 if (info->board->must_hwid) in mxser_shutdown_port()
831 info->ioaddr + UART_FCR); in mxser_shutdown_port()
834 info->ioaddr + UART_FCR); in mxser_shutdown_port()
837 (void) inb(info->ioaddr + UART_RX); in mxser_shutdown_port()
840 if (info->board->must_hwid) in mxser_shutdown_port()
841 mxser_must_no_sw_flow_control(info->ioaddr); in mxser_shutdown_port()
843 spin_unlock_irqrestore(&info->slock, flags); in mxser_shutdown_port()
849 * the IRQ chain. It also performs the serial-specific
854 struct tty_port *tport = tty->port; in mxser_open()
857 tty->driver_data = port; in mxser_open()
864 struct mxser_port *info = tty->driver_data; in mxser_flush_buffer()
869 spin_lock_irqsave(&info->slock, flags); in mxser_flush_buffer()
870 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; in mxser_flush_buffer()
872 fcr = inb(info->ioaddr + UART_FCR); in mxser_flush_buffer()
874 info->ioaddr + UART_FCR); in mxser_flush_buffer()
875 outb(fcr, info->ioaddr + UART_FCR); in mxser_flush_buffer()
877 spin_unlock_irqrestore(&info->slock, flags); in mxser_flush_buffer()
893 info->IER &= ~UART_IER_RLSI; in mxser_close_port()
894 if (info->board->must_hwid) in mxser_close_port()
895 info->IER &= ~MOXA_MUST_RECV_ISR; in mxser_close_port()
897 outb(info->IER, info->ioaddr + UART_IER); in mxser_close_port()
904 while (!(inb(info->ioaddr + UART_LSR) & UART_LSR_TEMT)) { in mxser_close_port()
919 struct mxser_port *info = tty->driver_data; in mxser_close()
920 struct tty_port *port = &info->port; in mxser_close()
926 info->closing = 1; in mxser_close()
927 mutex_lock(&port->mutex); in mxser_close()
934 mutex_unlock(&port->mutex); in mxser_close()
935 info->closing = 0; in mxser_close()
945 struct mxser_port *info = tty->driver_data; in mxser_write()
948 if (!info->port.xmit_buf) in mxser_write()
952 c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, in mxser_write()
953 SERIAL_XMIT_SIZE - info->xmit_head)); in mxser_write()
957 memcpy(info->port.xmit_buf + info->xmit_head, buf, c); in mxser_write()
958 spin_lock_irqsave(&info->slock, flags); in mxser_write()
959 info->xmit_head = (info->xmit_head + c) & in mxser_write()
960 (SERIAL_XMIT_SIZE - 1); in mxser_write()
961 info->xmit_cnt += c; in mxser_write()
962 spin_unlock_irqrestore(&info->slock, flags); in mxser_write()
965 count -= c; in mxser_write()
969 if (info->xmit_cnt && !tty->flow.stopped) in mxser_write()
970 if (!tty->hw_stopped || mxser_16550A_or_MUST(info)) in mxser_write()
978 struct mxser_port *info = tty->driver_data; in mxser_put_char()
981 if (!info->port.xmit_buf) in mxser_put_char()
984 if (info->xmit_cnt >= SERIAL_XMIT_SIZE - 1) in mxser_put_char()
987 spin_lock_irqsave(&info->slock, flags); in mxser_put_char()
988 info->port.xmit_buf[info->xmit_head++] = ch; in mxser_put_char()
989 info->xmit_head &= SERIAL_XMIT_SIZE - 1; in mxser_put_char()
990 info->xmit_cnt++; in mxser_put_char()
991 spin_unlock_irqrestore(&info->slock, flags); in mxser_put_char()
999 struct mxser_port *info = tty->driver_data; in mxser_flush_chars()
1001 if (!info->xmit_cnt || tty->flow.stopped || !info->port.xmit_buf || in mxser_flush_chars()
1002 (tty->hw_stopped && !mxser_16550A_or_MUST(info))) in mxser_flush_chars()
1010 struct mxser_port *info = tty->driver_data; in mxser_write_room()
1013 ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1; in mxser_write_room()
1019 struct mxser_port *info = tty->driver_data; in mxser_chars_in_buffer()
1020 return info->xmit_cnt; in mxser_chars_in_buffer()
1024 * ------------------------------------------------------------
1026 * ------------------------------------------------------------
1031 struct mxser_port *info = tty->driver_data; in mxser_get_serial_info()
1032 struct tty_port *port = &info->port; in mxser_get_serial_info()
1035 mutex_lock(&port->mutex); in mxser_get_serial_info()
1037 close_delay = jiffies_to_msecs(info->port.close_delay) / 10; in mxser_get_serial_info()
1038 closing_wait = info->port.closing_wait; in mxser_get_serial_info()
1042 ss->type = info->type; in mxser_get_serial_info()
1043 ss->line = tty->index; in mxser_get_serial_info()
1044 ss->port = info->ioaddr; in mxser_get_serial_info()
1045 ss->irq = info->board->irq; in mxser_get_serial_info()
1046 ss->flags = info->port.flags; in mxser_get_serial_info()
1047 ss->baud_base = MXSER_BAUD_BASE; in mxser_get_serial_info()
1048 ss->close_delay = close_delay; in mxser_get_serial_info()
1049 ss->closing_wait = closing_wait; in mxser_get_serial_info()
1050 ss->custom_divisor = MXSER_CUSTOM_DIVISOR, in mxser_get_serial_info()
1051 mutex_unlock(&port->mutex); in mxser_get_serial_info()
1058 struct mxser_port *info = tty->driver_data; in mxser_set_serial_info()
1059 struct tty_port *port = &info->port; in mxser_set_serial_info()
1066 return -EIO; in mxser_set_serial_info()
1068 mutex_lock(&port->mutex); in mxser_set_serial_info()
1070 if (ss->irq != info->board->irq || in mxser_set_serial_info()
1071 ss->port != info->ioaddr) { in mxser_set_serial_info()
1072 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1073 return -EINVAL; in mxser_set_serial_info()
1076 old_speed = port->flags & ASYNC_SPD_MASK; in mxser_set_serial_info()
1078 close_delay = msecs_to_jiffies(ss->close_delay * 10); in mxser_set_serial_info()
1079 closing_wait = ss->closing_wait; in mxser_set_serial_info()
1084 if ((ss->baud_base != MXSER_BAUD_BASE) || in mxser_set_serial_info()
1085 (close_delay != port->close_delay) || in mxser_set_serial_info()
1086 (closing_wait != port->closing_wait) || in mxser_set_serial_info()
1087 ((ss->flags & ~ASYNC_USR_MASK) != (port->flags & ~ASYNC_USR_MASK))) { in mxser_set_serial_info()
1088 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1089 return -EPERM; in mxser_set_serial_info()
1091 port->flags = (port->flags & ~ASYNC_USR_MASK) | in mxser_set_serial_info()
1092 (ss->flags & ASYNC_USR_MASK); in mxser_set_serial_info()
1098 port->flags = ((port->flags & ~ASYNC_FLAGS) | in mxser_set_serial_info()
1099 (ss->flags & ASYNC_FLAGS)); in mxser_set_serial_info()
1100 port->close_delay = close_delay; in mxser_set_serial_info()
1101 port->closing_wait = closing_wait; in mxser_set_serial_info()
1102 if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST && in mxser_set_serial_info()
1103 (ss->baud_base != MXSER_BAUD_BASE || in mxser_set_serial_info()
1104 ss->custom_divisor != in mxser_set_serial_info()
1106 if (ss->custom_divisor == 0) { in mxser_set_serial_info()
1107 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1108 return -EINVAL; in mxser_set_serial_info()
1110 baud = ss->baud_base / ss->custom_divisor; in mxser_set_serial_info()
1114 info->type = ss->type; in mxser_set_serial_info()
1120 if (old_speed != (port->flags & ASYNC_SPD_MASK)) { in mxser_set_serial_info()
1121 spin_lock_irqsave(&info->slock, sl_flags); in mxser_set_serial_info()
1123 spin_unlock_irqrestore(&info->slock, sl_flags); in mxser_set_serial_info()
1130 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1135 * mxser_get_lsr_info - get line status register info
1151 spin_lock_irqsave(&info->slock, flags); in mxser_get_lsr_info()
1152 status = inb(info->ioaddr + UART_LSR); in mxser_get_lsr_info()
1153 spin_unlock_irqrestore(&info->slock, flags); in mxser_get_lsr_info()
1160 struct mxser_port *info = tty->driver_data; in mxser_tiocmget()
1165 return -EIO; in mxser_tiocmget()
1167 spin_lock_irqsave(&info->slock, flags); in mxser_tiocmget()
1168 control = info->MCR; in mxser_tiocmget()
1169 status = inb(info->ioaddr + UART_MSR); in mxser_tiocmget()
1172 spin_unlock_irqrestore(&info->slock, flags); in mxser_tiocmget()
1185 struct mxser_port *info = tty->driver_data; in mxser_tiocmset()
1189 return -EIO; in mxser_tiocmset()
1191 spin_lock_irqsave(&info->slock, flags); in mxser_tiocmset()
1194 info->MCR |= UART_MCR_RTS; in mxser_tiocmset()
1196 info->MCR |= UART_MCR_DTR; in mxser_tiocmset()
1199 info->MCR &= ~UART_MCR_RTS; in mxser_tiocmset()
1201 info->MCR &= ~UART_MCR_DTR; in mxser_tiocmset()
1203 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_tiocmset()
1204 spin_unlock_irqrestore(&info->slock, flags); in mxser_tiocmset()
1215 spin_lock_irqsave(&info->slock, flags); in mxser_cflags_changed()
1216 cnow = info->icount; /* atomic copy */ in mxser_cflags_changed()
1217 spin_unlock_irqrestore(&info->slock, flags); in mxser_cflags_changed()
1219 ret = ((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) || in mxser_cflags_changed()
1220 ((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) || in mxser_cflags_changed()
1221 ((arg & TIOCM_CD) && (cnow.dcd != cprev->dcd)) || in mxser_cflags_changed()
1222 ((arg & TIOCM_CTS) && (cnow.cts != cprev->cts)); in mxser_cflags_changed()
1237 if (port->board->must_hwid != MOXA_MUST_MU860_HWID) in mxser_ioctl_op_mode()
1238 return -EFAULT; in mxser_ioctl_op_mode()
1242 return -EFAULT; in mxser_ioctl_op_mode()
1245 return -EINVAL; in mxser_ioctl_op_mode()
1247 spin_lock_irq(&port->slock); in mxser_ioctl_op_mode()
1248 val = inb(port->opmode_ioaddr); in mxser_ioctl_op_mode()
1251 outb(val, port->opmode_ioaddr); in mxser_ioctl_op_mode()
1252 spin_unlock_irq(&port->slock); in mxser_ioctl_op_mode()
1257 spin_lock_irq(&port->slock); in mxser_ioctl_op_mode()
1258 opmode = inb(port->opmode_ioaddr) >> shiftbit; in mxser_ioctl_op_mode()
1259 spin_unlock_irq(&port->slock); in mxser_ioctl_op_mode()
1267 struct mxser_port *info = tty->driver_data; in mxser_ioctl()
1273 return mxser_ioctl_op_mode(info, tty->index, in mxser_ioctl()
1277 return -EIO; in mxser_ioctl()
1284 * - mask passed in arg for lines of interest in mxser_ioctl()
1289 spin_lock_irqsave(&info->slock, flags); in mxser_ioctl()
1290 cnow = info->icount; /* note the counters on entry */ in mxser_ioctl()
1291 spin_unlock_irqrestore(&info->slock, flags); in mxser_ioctl()
1293 return wait_event_interruptible(info->port.delta_msr_wait, in mxser_ioctl()
1296 return -ENOIOCTLCMD; in mxser_ioctl()
1304 * NB: both 1->0 and 0->1 transitions are counted except for
1305 * RI where only 0->1 is counted.
1312 struct mxser_port *info = tty->driver_data; in mxser_get_icount()
1316 spin_lock_irqsave(&info->slock, flags); in mxser_get_icount()
1317 cnow = info->icount; in mxser_get_icount()
1318 spin_unlock_irqrestore(&info->slock, flags); in mxser_get_icount()
1320 icount->frame = cnow.frame; in mxser_get_icount()
1321 icount->brk = cnow.brk; in mxser_get_icount()
1322 icount->overrun = cnow.overrun; in mxser_get_icount()
1323 icount->buf_overrun = cnow.buf_overrun; in mxser_get_icount()
1324 icount->parity = cnow.parity; in mxser_get_icount()
1325 icount->rx = cnow.rx; in mxser_get_icount()
1326 icount->tx = cnow.tx; in mxser_get_icount()
1327 icount->cts = cnow.cts; in mxser_get_icount()
1328 icount->dsr = cnow.dsr; in mxser_get_icount()
1329 icount->rng = cnow.rng; in mxser_get_icount()
1330 icount->dcd = cnow.dcd; in mxser_get_icount()
1336 struct mxser_port *info = tty->driver_data; in mxser_stoprx()
1338 info->ldisc_stop_rx = 1; in mxser_stoprx()
1340 if (info->board->must_hwid) { in mxser_stoprx()
1341 info->IER &= ~MOXA_MUST_RECV_ISR; in mxser_stoprx()
1342 outb(info->IER, info->ioaddr + UART_IER); in mxser_stoprx()
1344 info->x_char = STOP_CHAR(tty); in mxser_stoprx()
1345 outb(0, info->ioaddr + UART_IER); in mxser_stoprx()
1346 info->IER |= UART_IER_THRI; in mxser_stoprx()
1347 outb(info->IER, info->ioaddr + UART_IER); in mxser_stoprx()
1352 info->MCR &= ~UART_MCR_RTS; in mxser_stoprx()
1353 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_stoprx()
1358 * This routine is called by the upper-layer tty layer to signal that
1368 struct mxser_port *info = tty->driver_data; in mxser_unthrottle()
1371 info->ldisc_stop_rx = 0; in mxser_unthrottle()
1373 if (info->x_char) in mxser_unthrottle()
1374 info->x_char = 0; in mxser_unthrottle()
1376 if (info->board->must_hwid) { in mxser_unthrottle()
1377 info->IER |= MOXA_MUST_RECV_ISR; in mxser_unthrottle()
1378 outb(info->IER, info->ioaddr + UART_IER); in mxser_unthrottle()
1380 info->x_char = START_CHAR(tty); in mxser_unthrottle()
1381 outb(0, info->ioaddr + UART_IER); in mxser_unthrottle()
1382 info->IER |= UART_IER_THRI; in mxser_unthrottle()
1383 outb(info->IER, info->ioaddr + UART_IER); in mxser_unthrottle()
1389 info->MCR |= UART_MCR_RTS; in mxser_unthrottle()
1390 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_unthrottle()
1397 * This routines are called before setting or resetting tty->flow.stopped.
1402 struct mxser_port *info = tty->driver_data; in mxser_stop()
1405 spin_lock_irqsave(&info->slock, flags); in mxser_stop()
1406 if (info->IER & UART_IER_THRI) in mxser_stop()
1408 spin_unlock_irqrestore(&info->slock, flags); in mxser_stop()
1413 struct mxser_port *info = tty->driver_data; in mxser_start()
1416 spin_lock_irqsave(&info->slock, flags); in mxser_start()
1417 if (info->xmit_cnt && info->port.xmit_buf) in mxser_start()
1419 spin_unlock_irqrestore(&info->slock, flags); in mxser_start()
1424 struct mxser_port *info = tty->driver_data; in mxser_set_termios()
1427 spin_lock_irqsave(&info->slock, flags); in mxser_set_termios()
1429 spin_unlock_irqrestore(&info->slock, flags); in mxser_set_termios()
1431 if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) { in mxser_set_termios()
1432 tty->hw_stopped = 0; in mxser_set_termios()
1437 if ((old_termios->c_iflag & IXON) && !I_IXON(tty)) { in mxser_set_termios()
1438 tty->flow.stopped = 0; in mxser_set_termios()
1440 if (info->board->must_hwid) { in mxser_set_termios()
1441 spin_lock_irqsave(&info->slock, flags); in mxser_set_termios()
1442 mxser_must_set_rx_sw_flow_control(info->ioaddr, false); in mxser_set_termios()
1443 spin_unlock_irqrestore(&info->slock, flags); in mxser_set_termios()
1451 * mxser_wait_until_sent() --- wait until the transmitter is empty
1455 struct mxser_port *info = tty->driver_data; in mxser_wait_until_sent()
1460 if (info->type == PORT_UNKNOWN) in mxser_wait_until_sent()
1463 if (info->xmit_fifo_size == 0) in mxser_wait_until_sent()
1473 * the NIST-PCTS. in mxser_wait_until_sent()
1475 char_time = (info->timeout - HZ / 50) / info->xmit_fifo_size; in mxser_wait_until_sent()
1486 * takes longer than info->timeout, this is probably due to a in mxser_wait_until_sent()
1488 * 2*info->timeout. in mxser_wait_until_sent()
1490 if (!timeout || timeout > 2 * info->timeout) in mxser_wait_until_sent()
1491 timeout = 2 * info->timeout; in mxser_wait_until_sent()
1493 spin_lock_irqsave(&info->slock, flags); in mxser_wait_until_sent()
1494 while (!((lsr = inb(info->ioaddr + UART_LSR)) & UART_LSR_TEMT)) { in mxser_wait_until_sent()
1495 spin_unlock_irqrestore(&info->slock, flags); in mxser_wait_until_sent()
1497 spin_lock_irqsave(&info->slock, flags); in mxser_wait_until_sent()
1503 spin_unlock_irqrestore(&info->slock, flags); in mxser_wait_until_sent()
1512 struct mxser_port *info = tty->driver_data; in mxser_hangup()
1515 tty_port_hangup(&info->port); in mxser_hangup()
1519 * mxser_rs_break() --- routine which turns the break handling on or off
1523 struct mxser_port *info = tty->driver_data; in mxser_rs_break()
1527 spin_lock_irqsave(&info->slock, flags); in mxser_rs_break()
1528 lcr = inb(info->ioaddr + UART_LCR); in mxser_rs_break()
1529 if (break_state == -1) in mxser_rs_break()
1533 outb(lcr, info->ioaddr + UART_LCR); in mxser_rs_break()
1534 spin_unlock_irqrestore(&info->slock, flags); in mxser_rs_break()
1542 enum mxser_must_hwid hwid = port->board->must_hwid; in mxser_receive_chars_new()
1554 gdl = inb(port->ioaddr + MOXA_MUST_GDL_REGISTER); in mxser_receive_chars_new()
1558 if (gdl >= tty->receive_room && !port->ldisc_stop_rx) in mxser_receive_chars_new()
1561 while (gdl--) { in mxser_receive_chars_new()
1562 u8 ch = inb(port->ioaddr + UART_RX); in mxser_receive_chars_new()
1563 tty_insert_flip_char(&port->port, ch, 0); in mxser_receive_chars_new()
1572 enum mxser_must_hwid hwid = port->board->must_hwid; in mxser_receive_chars_old()
1573 int recv_room = tty->receive_room; in mxser_receive_chars_old()
1580 if (max-- < 0) in mxser_receive_chars_old()
1583 ch = inb(port->ioaddr + UART_RX); in mxser_receive_chars_old()
1587 port->ioaddr + UART_FCR); in mxser_receive_chars_old()
1588 status &= port->read_status_mask; in mxser_receive_chars_old()
1589 if (status & port->ignore_status_mask) { in mxser_receive_chars_old()
1597 port->icount.brk++; in mxser_receive_chars_old()
1599 if (port->port.flags & ASYNC_SAK) in mxser_receive_chars_old()
1603 port->icount.parity++; in mxser_receive_chars_old()
1606 port->icount.frame++; in mxser_receive_chars_old()
1609 port->icount.overrun++; in mxser_receive_chars_old()
1612 tty_insert_flip_char(&port->port, ch, flag); in mxser_receive_chars_old()
1615 if (!port->ldisc_stop_rx) in mxser_receive_chars_old()
1625 status = inb(port->ioaddr + UART_LSR); in mxser_receive_chars_old()
1634 if (tty->receive_room == 0 && !port->ldisc_stop_rx) in mxser_receive_chars()
1640 tty_flip_buffer_push(&port->port); in mxser_receive_chars()
1649 if (port->x_char) { in mxser_transmit_chars()
1650 outb(port->x_char, port->ioaddr + UART_TX); in mxser_transmit_chars()
1651 port->x_char = 0; in mxser_transmit_chars()
1652 port->icount.tx++; in mxser_transmit_chars()
1656 if (port->port.xmit_buf == NULL) in mxser_transmit_chars()
1659 if (!port->xmit_cnt || tty->flow.stopped || in mxser_transmit_chars()
1660 (tty->hw_stopped && !mxser_16550A_or_MUST(port))) { in mxser_transmit_chars()
1665 cnt = port->xmit_cnt; in mxser_transmit_chars()
1666 count = port->xmit_fifo_size; in mxser_transmit_chars()
1668 outb(port->port.xmit_buf[port->xmit_tail++], in mxser_transmit_chars()
1669 port->ioaddr + UART_TX); in mxser_transmit_chars()
1670 port->xmit_tail = port->xmit_tail & (SERIAL_XMIT_SIZE - 1); in mxser_transmit_chars()
1671 if (!--port->xmit_cnt) in mxser_transmit_chars()
1673 } while (--count > 0); in mxser_transmit_chars()
1675 port->icount.tx += (cnt - port->xmit_cnt); in mxser_transmit_chars()
1677 if (port->xmit_cnt < WAKEUP_CHARS) in mxser_transmit_chars()
1680 if (!port->xmit_cnt) in mxser_transmit_chars()
1690 iir = inb(port->ioaddr + UART_IIR); in mxser_port_isr()
1695 tty = tty_port_tty_get(&port->port); in mxser_port_isr()
1696 if (!tty || port->closing || !tty_port_initialized(&port->port)) { in mxser_port_isr()
1697 status = inb(port->ioaddr + UART_LSR); in mxser_port_isr()
1700 port->ioaddr + UART_FCR); in mxser_port_isr()
1701 inb(port->ioaddr + UART_MSR); in mxser_port_isr()
1707 status = inb(port->ioaddr + UART_LSR); in mxser_port_isr()
1709 if (port->board->must_hwid) { in mxser_port_isr()
1716 status &= port->read_status_mask; in mxser_port_isr()
1721 msr = inb(port->ioaddr + UART_MSR); in mxser_port_isr()
1725 if (port->board->must_hwid) { in mxser_port_isr()
1747 unsigned int i, max = brd->nports; in mxser_interrupt()
1749 u8 irqbits, bits, mask = BIT(max) - 1; in mxser_interrupt()
1752 irqbits = inb(brd->vector) & mask; in mxser_interrupt()
1762 port = &brd->ports[i]; in mxser_interrupt()
1765 spin_lock(&port->slock); in mxser_interrupt()
1770 spin_unlock(&port->slock); in mxser_interrupt()
1787 .throttle = mxser_throttle,
1810 * The MOXA Smartio/Industio serial driver boot-time initialization code!
1819 brd->must_hwid = mxser_must_get_hwid(brd->ports[0].ioaddr); in mxser_initbrd()
1820 is_mu860 = brd->must_hwid == MOXA_MUST_MU860_HWID; in mxser_initbrd()
1823 if (Gpci_uart_info[i].type == brd->must_hwid) { in mxser_initbrd()
1824 brd->max_baud = Gpci_uart_info[i].max_baud; in mxser_initbrd()
1826 /* exception....CP-102 */ in mxser_initbrd()
1828 brd->max_baud = 921600; in mxser_initbrd()
1835 outb(0, brd->vector + 4); in mxser_initbrd()
1836 outb(0, brd->vector + 0x0c); in mxser_initbrd()
1839 for (i = 0; i < brd->nports; i++) { in mxser_initbrd()
1840 info = &brd->ports[i]; in mxser_initbrd()
1843 info->opmode_ioaddr = brd->vector + 4; in mxser_initbrd()
1845 info->opmode_ioaddr = brd->vector + 0x0c; in mxser_initbrd()
1847 tty_port_init(&info->port); in mxser_initbrd()
1848 info->port.ops = &mxser_port_ops; in mxser_initbrd()
1849 info->board = brd; in mxser_initbrd()
1850 info->ldisc_stop_rx = 0; in mxser_initbrd()
1853 if (brd->must_hwid != MOXA_OTHER_UART) in mxser_initbrd()
1854 mxser_must_set_enhance_mode(info->ioaddr, true); in mxser_initbrd()
1856 info->type = PORT_16550A; in mxser_initbrd()
1860 info->port.close_delay = 5 * HZ / 10; in mxser_initbrd()
1861 info->port.closing_wait = 30 * HZ; in mxser_initbrd()
1862 spin_lock_init(&info->slock); in mxser_initbrd()
1865 outb(inb(info->ioaddr + UART_IER) & 0xf0, in mxser_initbrd()
1866 info->ioaddr + UART_IER); in mxser_initbrd()
1876 unsigned short nports = MXSER_NPORTS(ent->driver_data); in mxser_probe()
1878 int retval = -EINVAL; in mxser_probe()
1882 dev_err(&pdev->dev, "too many boards found (maximum %d), board " in mxser_probe()
1887 brd = devm_kzalloc(&pdev->dev, struct_size(brd, ports, nports), in mxser_probe()
1892 brd->idx = i; in mxser_probe()
1893 __set_bit(brd->idx, mxser_boards); in mxser_probe()
1898 dev_err(&pdev->dev, "PCI enable failed\n"); in mxser_probe()
1908 brd->nports = nports; in mxser_probe()
1910 brd->ports[i].ioaddr = ioaddress + 8 * i; in mxser_probe()
1917 brd->vector = ioaddress; in mxser_probe()
1920 brd->irq = pdev->irq; in mxser_probe()
1922 mxser_initbrd(brd, ent->driver_data & MXSER_HIGHBAUD); in mxser_probe()
1924 retval = devm_request_irq(&pdev->dev, brd->irq, mxser_interrupt, in mxser_probe()
1927 dev_err(&pdev->dev, "request irq failed"); in mxser_probe()
1932 tty_dev = tty_port_register_device(&brd->ports[i].port, in mxser_probe()
1933 mxvar_sdriver, base + i, &pdev->dev); in mxser_probe()
1936 for (; i > 0; i--) in mxser_probe()
1938 base + i - 1); in mxser_probe()
1948 tty_port_destroy(&brd->ports[i].port); in mxser_probe()
1950 __clear_bit(brd->idx, mxser_boards); in mxser_probe()
1958 unsigned int i, base = brd->idx * MXSER_PORTS_PER_BOARD; in mxser_remove()
1960 for (i = 0; i < brd->nports; i++) { in mxser_remove()
1962 tty_port_destroy(&brd->ports[i].port); in mxser_remove()
1965 __clear_bit(brd->idx, mxser_boards); in mxser_remove()
1985 mxvar_sdriver->name = "ttyMI"; in mxser_module_init()
1986 mxvar_sdriver->major = ttymajor; in mxser_module_init()
1987 mxvar_sdriver->minor_start = 0; in mxser_module_init()
1988 mxvar_sdriver->type = TTY_DRIVER_TYPE_SERIAL; in mxser_module_init()
1989 mxvar_sdriver->subtype = SERIAL_TYPE_NORMAL; in mxser_module_init()
1990 mxvar_sdriver->init_termios = tty_std_termios; in mxser_module_init()
1991 mxvar_sdriver->init_termios.c_cflag = B9600|CS8|CREAD|HUPCL|CLOCAL; in mxser_module_init()