• Home
  • Raw
  • Download

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
110 { "CI-104J series", 4, },
113 /* 5*/ { "C102 series", 4, MXSER_HAS2 }, /* C102-ISA */
114 { "CI-132 series", 4, MXSER_HAS2 },
115 { "CI-134 series", 4, },
116 { "CP-132 series", 2, },
117 { "CP-114 series", 4, },
118 /*10*/ { "CT-114 series", 4, },
119 { "CP-102 series", 2, MXSER_HIGHBAUD },
120 { "CP-104U series", 4, },
121 { "CP-168U series", 8, },
122 { "CP-132U series", 2, },
123 /*15*/ { "CP-134U series", 4, },
124 { "CP-104JU series", 4, },
126 { "CP-118U series", 8, },
127 { "CP-102UL series", 2, },
128 /*20*/ { "CP-102U series", 2, },
129 { "CP-118EL series", 8, },
130 { "CP-168EL series", 8, },
131 { "CP-104EL series", 4, },
132 { "CB-108 series", 8, },
133 /*25*/ { "CB-114 series", 4, },
134 { "CB-134I series", 4, },
135 { "CP-138U series", 8, },
136 { "POS-104UL series", 4, },
137 { "CP-114UL series", 4, },
138 /*30*/ { "CP-102UF series", 2, },
139 { "CP-112UL series", 2, },
359 oldlcr = inb(info->ioaddr + UART_LCR); in mxser_set_must_fifo_value()
360 outb(MOXA_MUST_ENTER_ENCHANCE, info->ioaddr + UART_LCR); in mxser_set_must_fifo_value()
362 efr = inb(info->ioaddr + MOXA_MUST_EFR_REGISTER); in mxser_set_must_fifo_value()
366 outb(efr, info->ioaddr + MOXA_MUST_EFR_REGISTER); in mxser_set_must_fifo_value()
367 outb((u8)info->rx_high_water, info->ioaddr + MOXA_MUST_RBRTH_REGISTER); in mxser_set_must_fifo_value()
368 outb((u8)info->rx_trigger, info->ioaddr + MOXA_MUST_RBRTI_REGISTER); in mxser_set_must_fifo_value()
369 outb((u8)info->rx_low_water, info->ioaddr + MOXA_MUST_RBRTL_REGISTER); in mxser_set_must_fifo_value()
370 outb(oldlcr, info->ioaddr + UART_LCR); in mxser_set_must_fifo_value()
515 if ((info->type == PORT_16450) || (info->type == PORT_8250)) { in process_txrx_fifo()
516 info->rx_trigger = 1; in process_txrx_fifo()
517 info->rx_high_water = 1; in process_txrx_fifo()
518 info->rx_low_water = 1; in process_txrx_fifo()
519 info->xmit_fifo_size = 1; in process_txrx_fifo()
522 if (info->board->chip_flag == Gpci_uart_info[i].type) { in process_txrx_fifo()
523 info->rx_trigger = Gpci_uart_info[i].rx_trigger; in process_txrx_fifo()
524 info->rx_low_water = Gpci_uart_info[i].rx_low_water; in process_txrx_fifo()
525 info->rx_high_water = Gpci_uart_info[i].rx_high_water; in process_txrx_fifo()
526 info->xmit_fifo_size = Gpci_uart_info[i].xmit_fifo_size; in process_txrx_fifo()
550 return (inb(mp->ioaddr + UART_MSR) & UART_MSR_DCD)?1:0; in mxser_carrier_raised()
558 spin_lock_irqsave(&mp->slock, flags); in mxser_dtr_rts()
560 outb(inb(mp->ioaddr + UART_MCR) | in mxser_dtr_rts()
561 UART_MCR_DTR | UART_MCR_RTS, mp->ioaddr + UART_MCR); in mxser_dtr_rts()
563 outb(inb(mp->ioaddr + UART_MCR)&~(UART_MCR_DTR | UART_MCR_RTS), in mxser_dtr_rts()
564 mp->ioaddr + UART_MCR); in mxser_dtr_rts()
565 spin_unlock_irqrestore(&mp->slock, flags); in mxser_dtr_rts()
570 struct mxser_port *info = tty->driver_data; in mxser_set_baud()
575 if (!info->ioaddr) in mxser_set_baud()
576 return -1; in mxser_set_baud()
578 if (newspd > info->max_baud) in mxser_set_baud()
579 return -1; in mxser_set_baud()
582 quot = 2 * info->baud_base / 269; in mxser_set_baud()
585 quot = info->baud_base / newspd; in mxser_set_baud()
588 baud = info->baud_base/quot; in mxser_set_baud()
598 timeout = (u64)info->xmit_fifo_size * HZ * 10 * quot; in mxser_set_baud()
599 do_div(timeout, info->baud_base); in mxser_set_baud()
600 info->timeout = timeout + HZ / 50; /* Add .02 seconds of slop */ in mxser_set_baud()
603 info->MCR |= UART_MCR_DTR; in mxser_set_baud()
604 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_set_baud()
606 info->MCR &= ~UART_MCR_DTR; in mxser_set_baud()
607 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_set_baud()
611 cval = inb(info->ioaddr + UART_LCR); in mxser_set_baud()
613 outb(cval | UART_LCR_DLAB, info->ioaddr + UART_LCR); /* set DLAB */ in mxser_set_baud()
615 outb(quot & 0xff, info->ioaddr + UART_DLL); /* LS of divisor */ in mxser_set_baud()
616 outb(quot >> 8, info->ioaddr + UART_DLM); /* MS of divisor */ in mxser_set_baud()
617 outb(cval, info->ioaddr + UART_LCR); /* reset DLAB */ in mxser_set_baud()
621 quot = info->baud_base % newspd; in mxser_set_baud()
629 mxser_set_must_enum_value(info->ioaddr, quot); in mxser_set_baud()
632 mxser_set_must_enum_value(info->ioaddr, 0); in mxser_set_baud()
643 struct mxser_port *info = tty->driver_data; in mxser_change_speed()
647 cflag = tty->termios.c_cflag; in mxser_change_speed()
648 if (!info->ioaddr) in mxser_change_speed()
651 if (mxser_set_baud_method[tty->index] == 0) in mxser_change_speed()
681 if ((info->type == PORT_8250) || (info->type == PORT_16450)) { in mxser_change_speed()
682 if (info->board->chip_flag) { in mxser_change_speed()
690 if (info->board->chip_flag) { in mxser_change_speed()
694 switch (info->rx_trigger) { in mxser_change_speed()
712 info->IER &= ~UART_IER_MSI; in mxser_change_speed()
713 info->MCR &= ~UART_MCR_AFE; in mxser_change_speed()
714 tty_port_set_cts_flow(&info->port, cflag & CRTSCTS); in mxser_change_speed()
716 info->IER |= UART_IER_MSI; in mxser_change_speed()
717 if ((info->type == PORT_16550A) || (info->board->chip_flag)) { in mxser_change_speed()
718 info->MCR |= UART_MCR_AFE; in mxser_change_speed()
720 status = inb(info->ioaddr + UART_MSR); in mxser_change_speed()
721 if (tty->hw_stopped) { in mxser_change_speed()
723 tty->hw_stopped = 0; in mxser_change_speed()
724 if (info->type != PORT_16550A && in mxser_change_speed()
725 !info->board->chip_flag) { in mxser_change_speed()
726 outb(info->IER & ~UART_IER_THRI, in mxser_change_speed()
727 info->ioaddr + in mxser_change_speed()
729 info->IER |= UART_IER_THRI; in mxser_change_speed()
730 outb(info->IER, info->ioaddr + in mxser_change_speed()
737 tty->hw_stopped = 1; in mxser_change_speed()
738 if ((info->type != PORT_16550A) && in mxser_change_speed()
739 (!info->board->chip_flag)) { in mxser_change_speed()
740 info->IER &= ~UART_IER_THRI; in mxser_change_speed()
741 outb(info->IER, info->ioaddr + in mxser_change_speed()
748 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_change_speed()
749 tty_port_set_check_carrier(&info->port, ~cflag & CLOCAL); in mxser_change_speed()
751 info->IER |= UART_IER_MSI; in mxser_change_speed()
752 outb(info->IER, info->ioaddr + UART_IER); in mxser_change_speed()
757 info->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; in mxser_change_speed()
759 info->read_status_mask |= UART_LSR_FE | UART_LSR_PE; in mxser_change_speed()
761 info->read_status_mask |= UART_LSR_BI; in mxser_change_speed()
763 info->ignore_status_mask = 0; in mxser_change_speed()
766 info->ignore_status_mask |= UART_LSR_BI; in mxser_change_speed()
767 info->read_status_mask |= UART_LSR_BI; in mxser_change_speed()
773 info->ignore_status_mask |= in mxser_change_speed()
777 info->read_status_mask |= in mxser_change_speed()
783 if (info->board->chip_flag) { in mxser_change_speed()
784 mxser_set_must_xon1_value(info->ioaddr, START_CHAR(tty)); in mxser_change_speed()
785 mxser_set_must_xoff1_value(info->ioaddr, STOP_CHAR(tty)); in mxser_change_speed()
788 info->ioaddr); in mxser_change_speed()
791 info->ioaddr); in mxser_change_speed()
795 info->ioaddr); in mxser_change_speed()
798 info->ioaddr); in mxser_change_speed()
803 outb(fcr, info->ioaddr + UART_FCR); /* set fcr */ in mxser_change_speed()
804 outb(cval, info->ioaddr + UART_LCR); in mxser_change_speed()
812 port->icount.rng++; in mxser_check_modem_status()
814 port->icount.dsr++; in mxser_check_modem_status()
816 port->icount.dcd++; in mxser_check_modem_status()
818 port->icount.cts++; in mxser_check_modem_status()
819 port->mon_data.modem_status = status; in mxser_check_modem_status()
820 wake_up_interruptible(&port->port.delta_msr_wait); in mxser_check_modem_status()
822 if (tty_port_check_carrier(&port->port) && (status & UART_MSR_DDCD)) { in mxser_check_modem_status()
824 wake_up_interruptible(&port->port.open_wait); in mxser_check_modem_status()
827 if (tty_port_cts_enabled(&port->port)) { in mxser_check_modem_status()
828 if (tty->hw_stopped) { in mxser_check_modem_status()
830 tty->hw_stopped = 0; in mxser_check_modem_status()
832 if ((port->type != PORT_16550A) && in mxser_check_modem_status()
833 (!port->board->chip_flag)) { in mxser_check_modem_status()
834 outb(port->IER & ~UART_IER_THRI, in mxser_check_modem_status()
835 port->ioaddr + UART_IER); in mxser_check_modem_status()
836 port->IER |= UART_IER_THRI; in mxser_check_modem_status()
837 outb(port->IER, port->ioaddr + in mxser_check_modem_status()
844 tty->hw_stopped = 1; in mxser_check_modem_status()
845 if (port->type != PORT_16550A && in mxser_check_modem_status()
846 !port->board->chip_flag) { in mxser_check_modem_status()
847 port->IER &= ~UART_IER_THRI; in mxser_check_modem_status()
848 outb(port->IER, port->ioaddr + in mxser_check_modem_status()
865 return -ENOMEM; in mxser_activate()
867 spin_lock_irqsave(&info->slock, flags); in mxser_activate()
869 if (!info->ioaddr || !info->type) { in mxser_activate()
870 set_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
871 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
875 info->port.xmit_buf = (unsigned char *) page; in mxser_activate()
881 if (info->board->chip_flag) in mxser_activate()
884 MOXA_MUST_FCR_GDA_MODE_ENABLE), info->ioaddr + UART_FCR); in mxser_activate()
887 info->ioaddr + UART_FCR); in mxser_activate()
894 if (inb(info->ioaddr + UART_LSR) == 0xff) { in mxser_activate()
895 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
897 set_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
901 ret = -ENODEV; in mxser_activate()
908 (void) inb(info->ioaddr + UART_LSR); in mxser_activate()
909 (void) inb(info->ioaddr + UART_RX); in mxser_activate()
910 (void) inb(info->ioaddr + UART_IIR); in mxser_activate()
911 (void) inb(info->ioaddr + UART_MSR); in mxser_activate()
916 outb(UART_LCR_WLEN8, info->ioaddr + UART_LCR); /* reset DLAB */ in mxser_activate()
917 info->MCR = UART_MCR_DTR | UART_MCR_RTS; in mxser_activate()
918 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_activate()
923 info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; in mxser_activate()
925 if (info->board->chip_flag) in mxser_activate()
926 info->IER |= MOXA_MUST_IER_EGDAI; in mxser_activate()
927 outb(info->IER, info->ioaddr + UART_IER); /* enable interrupts */ in mxser_activate()
932 (void) inb(info->ioaddr + UART_LSR); in mxser_activate()
933 (void) inb(info->ioaddr + UART_RX); in mxser_activate()
934 (void) inb(info->ioaddr + UART_IIR); in mxser_activate()
935 (void) inb(info->ioaddr + UART_MSR); in mxser_activate()
937 clear_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
938 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; in mxser_activate()
944 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
949 info->port.xmit_buf = NULL; in mxser_activate()
961 spin_lock_irqsave(&info->slock, flags); in mxser_shutdown_port()
967 wake_up_interruptible(&info->port.delta_msr_wait); in mxser_shutdown_port()
972 if (info->port.xmit_buf) { in mxser_shutdown_port()
973 free_page((unsigned long) info->port.xmit_buf); in mxser_shutdown_port()
974 info->port.xmit_buf = NULL; in mxser_shutdown_port()
977 info->IER = 0; in mxser_shutdown_port()
978 outb(0x00, info->ioaddr + UART_IER); in mxser_shutdown_port()
981 if (info->board->chip_flag) in mxser_shutdown_port()
984 info->ioaddr + UART_FCR); in mxser_shutdown_port()
987 info->ioaddr + UART_FCR); in mxser_shutdown_port()
990 (void) inb(info->ioaddr + UART_RX); in mxser_shutdown_port()
993 if (info->board->chip_flag) in mxser_shutdown_port()
994 SET_MOXA_MUST_NO_SOFTWARE_FLOW_CONTROL(info->ioaddr); in mxser_shutdown_port()
996 spin_unlock_irqrestore(&info->slock, flags); in mxser_shutdown_port()
1002 * the IRQ chain. It also performs the serial-specific
1010 line = tty->index; in mxser_open()
1014 if (!info->ioaddr) in mxser_open()
1015 return -ENODEV; in mxser_open()
1017 tty->driver_data = info; in mxser_open()
1018 return tty_port_open(&info->port, tty, filp); in mxser_open()
1023 struct mxser_port *info = tty->driver_data; in mxser_flush_buffer()
1028 spin_lock_irqsave(&info->slock, flags); in mxser_flush_buffer()
1029 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; in mxser_flush_buffer()
1031 fcr = inb(info->ioaddr + UART_FCR); in mxser_flush_buffer()
1033 info->ioaddr + UART_FCR); in mxser_flush_buffer()
1034 outb(fcr, info->ioaddr + UART_FCR); in mxser_flush_buffer()
1036 spin_unlock_irqrestore(&info->slock, flags); in mxser_flush_buffer()
1052 info->IER &= ~UART_IER_RLSI; in mxser_close_port()
1053 if (info->board->chip_flag) in mxser_close_port()
1054 info->IER &= ~MOXA_MUST_RECV_ISR; in mxser_close_port()
1056 outb(info->IER, info->ioaddr + UART_IER); in mxser_close_port()
1063 while (!(inb(info->ioaddr + UART_LSR) & UART_LSR_TEMT)) { in mxser_close_port()
1078 struct mxser_port *info = tty->driver_data; in mxser_close()
1079 struct tty_port *port = &info->port; in mxser_close()
1081 if (tty->index == MXSER_PORTS || info == NULL) in mxser_close()
1085 info->closing = 1; in mxser_close()
1086 mutex_lock(&port->mutex); in mxser_close()
1093 mutex_unlock(&port->mutex); in mxser_close()
1094 info->closing = 0; in mxser_close()
1104 struct mxser_port *info = tty->driver_data; in mxser_write()
1107 if (!info->port.xmit_buf) in mxser_write()
1111 c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, in mxser_write()
1112 SERIAL_XMIT_SIZE - info->xmit_head)); in mxser_write()
1116 memcpy(info->port.xmit_buf + info->xmit_head, buf, c); in mxser_write()
1117 spin_lock_irqsave(&info->slock, flags); in mxser_write()
1118 info->xmit_head = (info->xmit_head + c) & in mxser_write()
1119 (SERIAL_XMIT_SIZE - 1); in mxser_write()
1120 info->xmit_cnt += c; in mxser_write()
1121 spin_unlock_irqrestore(&info->slock, flags); in mxser_write()
1124 count -= c; in mxser_write()
1128 if (info->xmit_cnt && !tty->stopped) { in mxser_write()
1129 if (!tty->hw_stopped || in mxser_write()
1130 (info->type == PORT_16550A) || in mxser_write()
1131 (info->board->chip_flag)) { in mxser_write()
1132 spin_lock_irqsave(&info->slock, flags); in mxser_write()
1133 outb(info->IER & ~UART_IER_THRI, info->ioaddr + in mxser_write()
1135 info->IER |= UART_IER_THRI; in mxser_write()
1136 outb(info->IER, info->ioaddr + UART_IER); in mxser_write()
1137 spin_unlock_irqrestore(&info->slock, flags); in mxser_write()
1145 struct mxser_port *info = tty->driver_data; in mxser_put_char()
1148 if (!info->port.xmit_buf) in mxser_put_char()
1151 if (info->xmit_cnt >= SERIAL_XMIT_SIZE - 1) in mxser_put_char()
1154 spin_lock_irqsave(&info->slock, flags); in mxser_put_char()
1155 info->port.xmit_buf[info->xmit_head++] = ch; in mxser_put_char()
1156 info->xmit_head &= SERIAL_XMIT_SIZE - 1; in mxser_put_char()
1157 info->xmit_cnt++; in mxser_put_char()
1158 spin_unlock_irqrestore(&info->slock, flags); in mxser_put_char()
1159 if (!tty->stopped) { in mxser_put_char()
1160 if (!tty->hw_stopped || in mxser_put_char()
1161 (info->type == PORT_16550A) || in mxser_put_char()
1162 info->board->chip_flag) { in mxser_put_char()
1163 spin_lock_irqsave(&info->slock, flags); in mxser_put_char()
1164 outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER); in mxser_put_char()
1165 info->IER |= UART_IER_THRI; in mxser_put_char()
1166 outb(info->IER, info->ioaddr + UART_IER); in mxser_put_char()
1167 spin_unlock_irqrestore(&info->slock, flags); in mxser_put_char()
1176 struct mxser_port *info = tty->driver_data; in mxser_flush_chars()
1179 if (info->xmit_cnt <= 0 || tty->stopped || !info->port.xmit_buf || in mxser_flush_chars()
1180 (tty->hw_stopped && info->type != PORT_16550A && in mxser_flush_chars()
1181 !info->board->chip_flag)) in mxser_flush_chars()
1184 spin_lock_irqsave(&info->slock, flags); in mxser_flush_chars()
1186 outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER); in mxser_flush_chars()
1187 info->IER |= UART_IER_THRI; in mxser_flush_chars()
1188 outb(info->IER, info->ioaddr + UART_IER); in mxser_flush_chars()
1190 spin_unlock_irqrestore(&info->slock, flags); in mxser_flush_chars()
1195 struct mxser_port *info = tty->driver_data; in mxser_write_room()
1198 ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1; in mxser_write_room()
1204 struct mxser_port *info = tty->driver_data; in mxser_chars_in_buffer()
1205 return info->xmit_cnt; in mxser_chars_in_buffer()
1209 * ------------------------------------------------------------
1211 * ------------------------------------------------------------
1216 struct mxser_port *info = tty->driver_data; in mxser_get_serial_info()
1217 struct tty_port *port = &info->port; in mxser_get_serial_info()
1219 if (tty->index == MXSER_PORTS) in mxser_get_serial_info()
1220 return -ENOTTY; in mxser_get_serial_info()
1222 mutex_lock(&port->mutex); in mxser_get_serial_info()
1223 ss->type = info->type, in mxser_get_serial_info()
1224 ss->line = tty->index, in mxser_get_serial_info()
1225 ss->port = info->ioaddr, in mxser_get_serial_info()
1226 ss->irq = info->board->irq, in mxser_get_serial_info()
1227 ss->flags = info->port.flags, in mxser_get_serial_info()
1228 ss->baud_base = info->baud_base, in mxser_get_serial_info()
1229 ss->close_delay = info->port.close_delay, in mxser_get_serial_info()
1230 ss->closing_wait = info->port.closing_wait, in mxser_get_serial_info()
1231 ss->custom_divisor = info->custom_divisor, in mxser_get_serial_info()
1232 mutex_unlock(&port->mutex); in mxser_get_serial_info()
1239 struct mxser_port *info = tty->driver_data; in mxser_set_serial_info()
1240 struct tty_port *port = &info->port; in mxser_set_serial_info()
1246 if (tty->index == MXSER_PORTS) in mxser_set_serial_info()
1247 return -ENOTTY; in mxser_set_serial_info()
1249 return -EIO; in mxser_set_serial_info()
1251 mutex_lock(&port->mutex); in mxser_set_serial_info()
1252 if (!info->ioaddr) { in mxser_set_serial_info()
1253 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1254 return -ENODEV; in mxser_set_serial_info()
1257 if (ss->irq != info->board->irq || in mxser_set_serial_info()
1258 ss->port != info->ioaddr) { in mxser_set_serial_info()
1259 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1260 return -EINVAL; in mxser_set_serial_info()
1263 flags = port->flags & ASYNC_SPD_MASK; in mxser_set_serial_info()
1266 if ((ss->baud_base != info->baud_base) || in mxser_set_serial_info()
1267 (ss->close_delay != info->port.close_delay) || in mxser_set_serial_info()
1268 ((ss->flags & ~ASYNC_USR_MASK) != (info->port.flags & ~ASYNC_USR_MASK))) { in mxser_set_serial_info()
1269 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1270 return -EPERM; in mxser_set_serial_info()
1272 info->port.flags = ((info->port.flags & ~ASYNC_USR_MASK) | in mxser_set_serial_info()
1273 (ss->flags & ASYNC_USR_MASK)); in mxser_set_serial_info()
1279 port->flags = ((port->flags & ~ASYNC_FLAGS) | in mxser_set_serial_info()
1280 (ss->flags & ASYNC_FLAGS)); in mxser_set_serial_info()
1281 port->close_delay = ss->close_delay * HZ / 100; in mxser_set_serial_info()
1282 port->closing_wait = ss->closing_wait * HZ / 100; in mxser_set_serial_info()
1283 port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0; in mxser_set_serial_info()
1284 if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST && in mxser_set_serial_info()
1285 (ss->baud_base != info->baud_base || in mxser_set_serial_info()
1286 ss->custom_divisor != in mxser_set_serial_info()
1287 info->custom_divisor)) { in mxser_set_serial_info()
1288 if (ss->custom_divisor == 0) { in mxser_set_serial_info()
1289 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1290 return -EINVAL; in mxser_set_serial_info()
1292 baud = ss->baud_base / ss->custom_divisor; in mxser_set_serial_info()
1297 info->type = ss->type; in mxser_set_serial_info()
1302 if (flags != (port->flags & ASYNC_SPD_MASK)) { in mxser_set_serial_info()
1303 spin_lock_irqsave(&info->slock, sl_flags); in mxser_set_serial_info()
1305 spin_unlock_irqrestore(&info->slock, sl_flags); in mxser_set_serial_info()
1312 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1317 * mxser_get_lsr_info - get line status register info
1333 spin_lock_irqsave(&info->slock, flags); in mxser_get_lsr_info()
1334 status = inb(info->ioaddr + UART_LSR); in mxser_get_lsr_info()
1335 spin_unlock_irqrestore(&info->slock, flags); in mxser_get_lsr_info()
1342 struct mxser_port *info = tty->driver_data; in mxser_tiocmget()
1347 if (tty->index == MXSER_PORTS) in mxser_tiocmget()
1348 return -ENOIOCTLCMD; in mxser_tiocmget()
1350 return -EIO; in mxser_tiocmget()
1352 control = info->MCR; in mxser_tiocmget()
1354 spin_lock_irqsave(&info->slock, flags); in mxser_tiocmget()
1355 status = inb(info->ioaddr + UART_MSR); in mxser_tiocmget()
1358 spin_unlock_irqrestore(&info->slock, flags); in mxser_tiocmget()
1370 struct mxser_port *info = tty->driver_data; in mxser_tiocmset()
1374 if (tty->index == MXSER_PORTS) in mxser_tiocmset()
1375 return -ENOIOCTLCMD; in mxser_tiocmset()
1377 return -EIO; in mxser_tiocmset()
1379 spin_lock_irqsave(&info->slock, flags); in mxser_tiocmset()
1382 info->MCR |= UART_MCR_RTS; in mxser_tiocmset()
1384 info->MCR |= UART_MCR_DTR; in mxser_tiocmset()
1387 info->MCR &= ~UART_MCR_RTS; in mxser_tiocmset()
1389 info->MCR &= ~UART_MCR_DTR; in mxser_tiocmset()
1391 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_tiocmset()
1392 spin_unlock_irqrestore(&info->slock, flags); in mxser_tiocmset()
1415 return -1; in mxser_program_mode()
1427 id = -2; in mxser_program_mode()
1512 current->comm, cmd); in mxser_ioctl_special()
1523 /* The receive side is locked by port->slock but it isn't in mxser_ioctl_special()
1526 ret = -EFAULT; in mxser_ioctl_special()
1529 struct mxser_mstatus ms, __user *msu = argp; in mxser_ioctl_special() local
1533 port = &ip->port; in mxser_ioctl_special()
1534 memset(&ms, 0, sizeof(ms)); in mxser_ioctl_special()
1536 mutex_lock(&port->mutex); in mxser_ioctl_special()
1537 if (!ip->ioaddr) in mxser_ioctl_special()
1543 ms.cflag = ip->normal_termios.c_cflag; in mxser_ioctl_special()
1545 ms.cflag = tty->termios.c_cflag; in mxser_ioctl_special()
1547 spin_lock_irq(&ip->slock); in mxser_ioctl_special()
1548 status = inb(ip->ioaddr + UART_MSR); in mxser_ioctl_special()
1549 spin_unlock_irq(&ip->slock); in mxser_ioctl_special()
1551 ms.dcd = 1; in mxser_ioctl_special()
1553 ms.dsr = 1; in mxser_ioctl_special()
1555 ms.cts = 1; in mxser_ioctl_special()
1557 mutex_unlock(&port->mutex); in mxser_ioctl_special()
1558 if (copy_to_user(msu, &ms, sizeof(ms))) in mxser_ioctl_special()
1559 return -EFAULT; in mxser_ioctl_special()
1571 return -ENOMEM; in mxser_ioctl_special()
1575 if (p >= ARRAY_SIZE(me->rx_cnt)) { in mxser_ioctl_special()
1580 port = &ip->port; in mxser_ioctl_special()
1582 mutex_lock(&port->mutex); in mxser_ioctl_special()
1583 if (!ip->ioaddr) { in mxser_ioctl_special()
1584 mutex_unlock(&port->mutex); in mxser_ioctl_special()
1588 spin_lock_irq(&ip->slock); in mxser_ioctl_special()
1589 status = mxser_get_msr(ip->ioaddr, 0, p); in mxser_ioctl_special()
1592 ip->icount.rng++; in mxser_ioctl_special()
1594 ip->icount.dsr++; in mxser_ioctl_special()
1596 ip->icount.dcd++; in mxser_ioctl_special()
1598 ip->icount.cts++; in mxser_ioctl_special()
1600 ip->mon_data.modem_status = status; in mxser_ioctl_special()
1601 me->rx_cnt[p] = ip->mon_data.rxcnt; in mxser_ioctl_special()
1602 me->tx_cnt[p] = ip->mon_data.txcnt; in mxser_ioctl_special()
1603 me->up_rxcnt[p] = ip->mon_data.up_rxcnt; in mxser_ioctl_special()
1604 me->up_txcnt[p] = ip->mon_data.up_txcnt; in mxser_ioctl_special()
1605 me->modem_status[p] = in mxser_ioctl_special()
1606 ip->mon_data.modem_status; in mxser_ioctl_special()
1607 spin_unlock_irq(&ip->slock); in mxser_ioctl_special()
1609 tty = tty_port_tty_get(&ip->port); in mxser_ioctl_special()
1612 cflag = ip->normal_termios.c_cflag; in mxser_ioctl_special()
1613 iflag = ip->normal_termios.c_iflag; in mxser_ioctl_special()
1614 me->baudrate[p] = tty_termios_baud_rate(&ip->normal_termios); in mxser_ioctl_special()
1616 cflag = tty->termios.c_cflag; in mxser_ioctl_special()
1617 iflag = tty->termios.c_iflag; in mxser_ioctl_special()
1618 me->baudrate[p] = tty_get_baud_rate(tty); in mxser_ioctl_special()
1622 me->databits[p] = cflag & CSIZE; in mxser_ioctl_special()
1623 me->stopbits[p] = cflag & CSTOPB; in mxser_ioctl_special()
1624 me->parity[p] = cflag & (PARENB | PARODD | in mxser_ioctl_special()
1628 me->flowctrl[p] |= 0x03; in mxser_ioctl_special()
1631 me->flowctrl[p] |= 0x0C; in mxser_ioctl_special()
1633 if (ip->type == PORT_16550A) in mxser_ioctl_special()
1634 me->fifo[p] = 1; in mxser_ioctl_special()
1636 if (ip->board->chip_flag == MOXA_MUST_MU860_HWID) { in mxser_ioctl_special()
1637 opmode = inb(ip->opmode_ioaddr)>>((p % 4) * 2); in mxser_ioctl_special()
1642 me->iftype[p] = opmode; in mxser_ioctl_special()
1643 mutex_unlock(&port->mutex); in mxser_ioctl_special()
1647 ret = -EFAULT; in mxser_ioctl_special()
1652 return -ENOIOCTLCMD; in mxser_ioctl_special()
1664 spin_lock_irqsave(&info->slock, flags); in mxser_cflags_changed()
1665 cnow = info->icount; /* atomic copy */ in mxser_cflags_changed()
1666 spin_unlock_irqrestore(&info->slock, flags); in mxser_cflags_changed()
1668 ret = ((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) || in mxser_cflags_changed()
1669 ((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) || in mxser_cflags_changed()
1670 ((arg & TIOCM_CD) && (cnow.dcd != cprev->dcd)) || in mxser_cflags_changed()
1671 ((arg & TIOCM_CTS) && (cnow.cts != cprev->cts)); in mxser_cflags_changed()
1681 struct mxser_port *info = tty->driver_data; in mxser_ioctl()
1686 if (tty->index == MXSER_PORTS) in mxser_ioctl()
1696 if (info->board->chip_flag != MOXA_MUST_MU860_HWID) in mxser_ioctl()
1697 return -EFAULT; in mxser_ioctl()
1699 p = tty->index % 4; in mxser_ioctl()
1702 return -EFAULT; in mxser_ioctl()
1707 return -EFAULT; in mxser_ioctl()
1710 spin_lock_irq(&info->slock); in mxser_ioctl()
1711 val = inb(info->opmode_ioaddr); in mxser_ioctl()
1714 outb(val, info->opmode_ioaddr); in mxser_ioctl()
1715 spin_unlock_irq(&info->slock); in mxser_ioctl()
1718 spin_lock_irq(&info->slock); in mxser_ioctl()
1719 opmode = inb(info->opmode_ioaddr) >> shiftbit; in mxser_ioctl()
1720 spin_unlock_irq(&info->slock); in mxser_ioctl()
1723 return -EFAULT; in mxser_ioctl()
1729 return -EIO; in mxser_ioctl()
1736 * - mask passed in arg for lines of interest in mxser_ioctl()
1741 spin_lock_irqsave(&info->slock, flags); in mxser_ioctl()
1742 cnow = info->icount; /* note the counters on entry */ in mxser_ioctl()
1743 spin_unlock_irqrestore(&info->slock, flags); in mxser_ioctl()
1745 return wait_event_interruptible(info->port.delta_msr_wait, in mxser_ioctl()
1748 return put_user(info->baud_base != 115200 ? 1 : 0, (int __user *)argp); in mxser_ioctl()
1750 spin_lock_irq(&info->slock); in mxser_ioctl()
1751 info->mon_data.rxcnt = 0; in mxser_ioctl()
1752 info->mon_data.txcnt = 0; in mxser_ioctl()
1753 spin_unlock_irq(&info->slock); in mxser_ioctl()
1760 spin_lock_irq(&info->slock); in mxser_ioctl()
1761 lsr = inb(info->ioaddr + UART_LSR) & UART_LSR_THRE; in mxser_ioctl()
1762 spin_unlock_irq(&info->slock); in mxser_ioctl()
1770 spin_lock_irq(&info->slock); in mxser_ioctl()
1771 status = mxser_get_msr(info->ioaddr, 1, tty->index); in mxser_ioctl()
1774 mcr = inb(info->ioaddr + UART_MCR); in mxser_ioctl()
1775 spin_unlock_irq(&info->slock); in mxser_ioctl()
1778 info->mon_data.hold_reason &= ~NPPI_NOTIFY_XOFFHOLD; in mxser_ioctl()
1780 info->mon_data.hold_reason |= NPPI_NOTIFY_XOFFHOLD; in mxser_ioctl()
1783 info->mon_data.hold_reason &= ~NPPI_NOTIFY_XOFFXENT; in mxser_ioctl()
1785 info->mon_data.hold_reason |= NPPI_NOTIFY_XOFFXENT; in mxser_ioctl()
1787 if (tty->hw_stopped) in mxser_ioctl()
1788 info->mon_data.hold_reason |= NPPI_NOTIFY_CTSHOLD; in mxser_ioctl()
1790 info->mon_data.hold_reason &= ~NPPI_NOTIFY_CTSHOLD; in mxser_ioctl()
1792 if (copy_to_user(argp, &info->mon_data, in mxser_ioctl()
1794 return -EFAULT; in mxser_ioctl()
1799 if (put_user(info->err_shadow, (unsigned char __user *)argp)) in mxser_ioctl()
1800 return -EFAULT; in mxser_ioctl()
1802 info->err_shadow = 0; in mxser_ioctl()
1809 return -EFAULT; in mxser_ioctl()
1810 mxser_set_baud_method[tty->index] = method; in mxser_ioctl()
1814 return -ENOIOCTLCMD; in mxser_ioctl()
1822 * NB: both 1->0 and 0->1 transitions are counted except for
1823 * RI where only 0->1 is counted.
1830 struct mxser_port *info = tty->driver_data; in mxser_get_icount()
1834 spin_lock_irqsave(&info->slock, flags); in mxser_get_icount()
1835 cnow = info->icount; in mxser_get_icount()
1836 spin_unlock_irqrestore(&info->slock, flags); in mxser_get_icount()
1838 icount->frame = cnow.frame; in mxser_get_icount()
1839 icount->brk = cnow.brk; in mxser_get_icount()
1840 icount->overrun = cnow.overrun; in mxser_get_icount()
1841 icount->buf_overrun = cnow.buf_overrun; in mxser_get_icount()
1842 icount->parity = cnow.parity; in mxser_get_icount()
1843 icount->rx = cnow.rx; in mxser_get_icount()
1844 icount->tx = cnow.tx; in mxser_get_icount()
1845 icount->cts = cnow.cts; in mxser_get_icount()
1846 icount->dsr = cnow.dsr; in mxser_get_icount()
1847 icount->rng = cnow.rng; in mxser_get_icount()
1848 icount->dcd = cnow.dcd; in mxser_get_icount()
1854 struct mxser_port *info = tty->driver_data; in mxser_stoprx()
1856 info->ldisc_stop_rx = 1; in mxser_stoprx()
1858 if (info->board->chip_flag) { in mxser_stoprx()
1859 info->IER &= ~MOXA_MUST_RECV_ISR; in mxser_stoprx()
1860 outb(info->IER, info->ioaddr + UART_IER); in mxser_stoprx()
1862 info->x_char = STOP_CHAR(tty); in mxser_stoprx()
1863 outb(0, info->ioaddr + UART_IER); in mxser_stoprx()
1864 info->IER |= UART_IER_THRI; in mxser_stoprx()
1865 outb(info->IER, info->ioaddr + UART_IER); in mxser_stoprx()
1870 info->MCR &= ~UART_MCR_RTS; in mxser_stoprx()
1871 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_stoprx()
1876 * This routine is called by the upper-layer tty layer to signal that
1886 struct mxser_port *info = tty->driver_data; in mxser_unthrottle()
1889 info->ldisc_stop_rx = 0; in mxser_unthrottle()
1891 if (info->x_char) in mxser_unthrottle()
1892 info->x_char = 0; in mxser_unthrottle()
1894 if (info->board->chip_flag) { in mxser_unthrottle()
1895 info->IER |= MOXA_MUST_RECV_ISR; in mxser_unthrottle()
1896 outb(info->IER, info->ioaddr + UART_IER); in mxser_unthrottle()
1898 info->x_char = START_CHAR(tty); in mxser_unthrottle()
1899 outb(0, info->ioaddr + UART_IER); in mxser_unthrottle()
1900 info->IER |= UART_IER_THRI; in mxser_unthrottle()
1901 outb(info->IER, info->ioaddr + UART_IER); in mxser_unthrottle()
1907 info->MCR |= UART_MCR_RTS; in mxser_unthrottle()
1908 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_unthrottle()
1915 * This routines are called before setting or resetting tty->stopped.
1920 struct mxser_port *info = tty->driver_data; in mxser_stop()
1923 spin_lock_irqsave(&info->slock, flags); in mxser_stop()
1924 if (info->IER & UART_IER_THRI) { in mxser_stop()
1925 info->IER &= ~UART_IER_THRI; in mxser_stop()
1926 outb(info->IER, info->ioaddr + UART_IER); in mxser_stop()
1928 spin_unlock_irqrestore(&info->slock, flags); in mxser_stop()
1933 struct mxser_port *info = tty->driver_data; in mxser_start()
1936 spin_lock_irqsave(&info->slock, flags); in mxser_start()
1937 if (info->xmit_cnt && info->port.xmit_buf) { in mxser_start()
1938 outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER); in mxser_start()
1939 info->IER |= UART_IER_THRI; in mxser_start()
1940 outb(info->IER, info->ioaddr + UART_IER); in mxser_start()
1942 spin_unlock_irqrestore(&info->slock, flags); in mxser_start()
1947 struct mxser_port *info = tty->driver_data; in mxser_set_termios()
1950 spin_lock_irqsave(&info->slock, flags); in mxser_set_termios()
1952 spin_unlock_irqrestore(&info->slock, flags); in mxser_set_termios()
1954 if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) { in mxser_set_termios()
1955 tty->hw_stopped = 0; in mxser_set_termios()
1960 if ((old_termios->c_iflag & IXON) && !I_IXON(tty)) { in mxser_set_termios()
1961 tty->stopped = 0; in mxser_set_termios()
1963 if (info->board->chip_flag) { in mxser_set_termios()
1964 spin_lock_irqsave(&info->slock, flags); in mxser_set_termios()
1966 info->ioaddr); in mxser_set_termios()
1967 spin_unlock_irqrestore(&info->slock, flags); in mxser_set_termios()
1975 * mxser_wait_until_sent() --- wait until the transmitter is empty
1979 struct mxser_port *info = tty->driver_data; in mxser_wait_until_sent()
1984 if (info->type == PORT_UNKNOWN) in mxser_wait_until_sent()
1987 if (info->xmit_fifo_size == 0) in mxser_wait_until_sent()
1997 * the NIST-PCTS. in mxser_wait_until_sent()
1999 char_time = (info->timeout - HZ / 50) / info->xmit_fifo_size; in mxser_wait_until_sent()
2010 * takes longer than info->timeout, this is probably due to a in mxser_wait_until_sent()
2012 * 2*info->timeout. in mxser_wait_until_sent()
2014 if (!timeout || timeout > 2 * info->timeout) in mxser_wait_until_sent()
2015 timeout = 2 * info->timeout; in mxser_wait_until_sent()
2017 spin_lock_irqsave(&info->slock, flags); in mxser_wait_until_sent()
2018 while (!((lsr = inb(info->ioaddr + UART_LSR)) & UART_LSR_TEMT)) { in mxser_wait_until_sent()
2019 spin_unlock_irqrestore(&info->slock, flags); in mxser_wait_until_sent()
2021 spin_lock_irqsave(&info->slock, flags); in mxser_wait_until_sent()
2027 spin_unlock_irqrestore(&info->slock, flags); in mxser_wait_until_sent()
2036 struct mxser_port *info = tty->driver_data; in mxser_hangup()
2039 tty_port_hangup(&info->port); in mxser_hangup()
2043 * mxser_rs_break() --- routine which turns the break handling on or off
2047 struct mxser_port *info = tty->driver_data; in mxser_rs_break()
2050 spin_lock_irqsave(&info->slock, flags); in mxser_rs_break()
2051 if (break_state == -1) in mxser_rs_break()
2052 outb(inb(info->ioaddr + UART_LCR) | UART_LCR_SBC, in mxser_rs_break()
2053 info->ioaddr + UART_LCR); in mxser_rs_break()
2055 outb(inb(info->ioaddr + UART_LCR) & ~UART_LCR_SBC, in mxser_rs_break()
2056 info->ioaddr + UART_LCR); in mxser_rs_break()
2057 spin_unlock_irqrestore(&info->slock, flags); in mxser_rs_break()
2070 recv_room = tty->receive_room; in mxser_receive_chars()
2071 if (recv_room == 0 && !port->ldisc_stop_rx) in mxser_receive_chars()
2073 if (port->board->chip_flag != MOXA_OTHER_UART) { in mxser_receive_chars()
2077 if (port->board->chip_flag == MOXA_MUST_MU860_HWID && in mxser_receive_chars()
2083 gdl = inb(port->ioaddr + MOXA_MUST_GDL_REGISTER); in mxser_receive_chars()
2085 if (port->board->chip_flag == MOXA_MUST_MU150_HWID) in mxser_receive_chars()
2088 if (!port->ldisc_stop_rx) in mxser_receive_chars()
2091 while (gdl--) { in mxser_receive_chars()
2092 ch = inb(port->ioaddr + UART_RX); in mxser_receive_chars()
2093 tty_insert_flip_char(&port->port, ch, 0); in mxser_receive_chars()
2101 if (max-- < 0) in mxser_receive_chars()
2104 ch = inb(port->ioaddr + UART_RX); in mxser_receive_chars()
2105 if (port->board->chip_flag && (*status & UART_LSR_OE)) in mxser_receive_chars()
2106 outb(0x23, port->ioaddr + UART_FCR); in mxser_receive_chars()
2107 *status &= port->read_status_mask; in mxser_receive_chars()
2108 if (*status & port->ignore_status_mask) { in mxser_receive_chars()
2116 port->icount.brk++; in mxser_receive_chars()
2118 if (port->port.flags & ASYNC_SAK) in mxser_receive_chars()
2122 port->icount.parity++; in mxser_receive_chars()
2125 port->icount.frame++; in mxser_receive_chars()
2128 port->icount.overrun++; in mxser_receive_chars()
2132 tty_insert_flip_char(&port->port, ch, flag); in mxser_receive_chars()
2135 if (!port->ldisc_stop_rx) in mxser_receive_chars()
2142 if (port->board->chip_flag) in mxser_receive_chars()
2145 *status = inb(port->ioaddr + UART_LSR); in mxser_receive_chars()
2149 mxvar_log.rxcnt[tty->index] += cnt; in mxser_receive_chars()
2150 port->mon_data.rxcnt += cnt; in mxser_receive_chars()
2151 port->mon_data.up_rxcnt += cnt; in mxser_receive_chars()
2154 * We are called from an interrupt context with &port->slock in mxser_receive_chars()
2158 spin_unlock(&port->slock); in mxser_receive_chars()
2159 tty_flip_buffer_push(&port->port); in mxser_receive_chars()
2160 spin_lock(&port->slock); in mxser_receive_chars()
2167 if (port->x_char) { in mxser_transmit_chars()
2168 outb(port->x_char, port->ioaddr + UART_TX); in mxser_transmit_chars()
2169 port->x_char = 0; in mxser_transmit_chars()
2170 mxvar_log.txcnt[tty->index]++; in mxser_transmit_chars()
2171 port->mon_data.txcnt++; in mxser_transmit_chars()
2172 port->mon_data.up_txcnt++; in mxser_transmit_chars()
2173 port->icount.tx++; in mxser_transmit_chars()
2177 if (port->port.xmit_buf == NULL) in mxser_transmit_chars()
2180 if (port->xmit_cnt <= 0 || tty->stopped || in mxser_transmit_chars()
2181 (tty->hw_stopped && in mxser_transmit_chars()
2182 (port->type != PORT_16550A) && in mxser_transmit_chars()
2183 (!port->board->chip_flag))) { in mxser_transmit_chars()
2184 port->IER &= ~UART_IER_THRI; in mxser_transmit_chars()
2185 outb(port->IER, port->ioaddr + UART_IER); in mxser_transmit_chars()
2189 cnt = port->xmit_cnt; in mxser_transmit_chars()
2190 count = port->xmit_fifo_size; in mxser_transmit_chars()
2192 outb(port->port.xmit_buf[port->xmit_tail++], in mxser_transmit_chars()
2193 port->ioaddr + UART_TX); in mxser_transmit_chars()
2194 port->xmit_tail = port->xmit_tail & (SERIAL_XMIT_SIZE - 1); in mxser_transmit_chars()
2195 if (--port->xmit_cnt <= 0) in mxser_transmit_chars()
2197 } while (--count > 0); in mxser_transmit_chars()
2198 mxvar_log.txcnt[tty->index] += (cnt - port->xmit_cnt); in mxser_transmit_chars()
2200 port->mon_data.txcnt += (cnt - port->xmit_cnt); in mxser_transmit_chars()
2201 port->mon_data.up_txcnt += (cnt - port->xmit_cnt); in mxser_transmit_chars()
2202 port->icount.tx += (cnt - port->xmit_cnt); in mxser_transmit_chars()
2204 if (port->xmit_cnt < WAKEUP_CHARS) in mxser_transmit_chars()
2207 if (port->xmit_cnt <= 0) { in mxser_transmit_chars()
2208 port->IER &= ~UART_IER_THRI; in mxser_transmit_chars()
2209 outb(port->IER, port->ioaddr + UART_IER); in mxser_transmit_chars()
2236 max = brd->info->nports; in mxser_interrupt()
2238 irqbits = inb(brd->vector) & brd->vector_mask; in mxser_interrupt()
2239 if (irqbits == brd->vector_mask) in mxser_interrupt()
2244 if (irqbits == brd->vector_mask) in mxser_interrupt()
2248 port = &brd->ports[i]; in mxser_interrupt()
2251 spin_lock(&port->slock); in mxser_interrupt()
2253 iir = inb(port->ioaddr + UART_IIR); in mxser_interrupt()
2257 tty = tty_port_tty_get(&port->port); in mxser_interrupt()
2258 if (!tty || port->closing || in mxser_interrupt()
2259 !tty_port_initialized(&port->port)) { in mxser_interrupt()
2260 status = inb(port->ioaddr + UART_LSR); in mxser_interrupt()
2261 outb(0x27, port->ioaddr + UART_FCR); in mxser_interrupt()
2262 inb(port->ioaddr + UART_MSR); in mxser_interrupt()
2267 status = inb(port->ioaddr + UART_LSR); in mxser_interrupt()
2270 port->err_shadow |= NPPI_NOTIFY_PARITY; in mxser_interrupt()
2272 port->err_shadow |= NPPI_NOTIFY_FRAMING; in mxser_interrupt()
2274 port->err_shadow |= in mxser_interrupt()
2277 port->err_shadow |= NPPI_NOTIFY_BREAK; in mxser_interrupt()
2279 if (port->board->chip_flag) { in mxser_interrupt()
2288 status &= port->read_status_mask; in mxser_interrupt()
2293 msr = inb(port->ioaddr + UART_MSR); in mxser_interrupt()
2297 if (port->board->chip_flag) { in mxser_interrupt()
2307 spin_unlock(&port->slock); in mxser_interrupt()
2325 .throttle = mxser_throttle,
2348 * The MOXA Smartio/Industio serial driver boot-time initialization code!
2358 brd->vector >= brd->ports[0].ioaddr && in mxser_overlapping_vector()
2359 brd->vector < brd->ports[0].ioaddr + 8 * brd->info->nports; in mxser_overlapping_vector()
2366 return request_region(brd->vector, 1, "mxser(vector)") ? 0 : -EIO; in mxser_request_vector()
2373 release_region(brd->vector, 1); in mxser_release_vector()
2378 release_region(brd->ports[0].ioaddr, 8 * brd->info->nports); in mxser_release_ISA_res()
2389 brd->ports[0].max_baud); in mxser_initbrd()
2391 for (i = 0; i < brd->info->nports; i++) { in mxser_initbrd()
2392 info = &brd->ports[i]; in mxser_initbrd()
2393 tty_port_init(&info->port); in mxser_initbrd()
2394 info->port.ops = &mxser_port_ops; in mxser_initbrd()
2395 info->board = brd; in mxser_initbrd()
2396 info->stop_rx = 0; in mxser_initbrd()
2397 info->ldisc_stop_rx = 0; in mxser_initbrd()
2400 if (brd->chip_flag != MOXA_OTHER_UART) in mxser_initbrd()
2401 mxser_enable_must_enchance_mode(info->ioaddr); in mxser_initbrd()
2403 info->type = brd->uart_type; in mxser_initbrd()
2407 info->custom_divisor = info->baud_base * 16; in mxser_initbrd()
2408 info->port.close_delay = 5 * HZ / 10; in mxser_initbrd()
2409 info->port.closing_wait = 30 * HZ; in mxser_initbrd()
2410 info->normal_termios = mxvar_sdriver->init_termios; in mxser_initbrd()
2411 memset(&info->mon_data, 0, sizeof(struct mxser_mon)); in mxser_initbrd()
2412 info->err_shadow = 0; in mxser_initbrd()
2413 spin_lock_init(&info->slock); in mxser_initbrd()
2416 outb(inb(info->ioaddr + UART_IER) & 0xf0, in mxser_initbrd()
2417 info->ioaddr + UART_IER); in mxser_initbrd()
2420 retval = request_irq(brd->irq, mxser_interrupt, IRQF_SHARED, "mxser", in mxser_initbrd()
2423 for (i = 0; i < brd->info->nports; i++) in mxser_initbrd()
2424 tty_port_destroy(&brd->ports[i].port); in mxser_initbrd()
2427 brd->info->name, brd->irq); in mxser_initbrd()
2437 for (i = 0; i < brd->info->nports; i++) { in mxser_board_remove()
2438 tty_unregister_device(mxvar_sdriver, brd->idx + i); in mxser_board_remove()
2439 tty_port_destroy(&brd->ports[i].port); in mxser_board_remove()
2441 free_irq(brd->irq, brd); in mxser_board_remove()
2450 brd->chip_flag = MOXA_OTHER_UART; in mxser_get_ISA_conf()
2455 brd->info = &mxser_cards[0]; in mxser_get_ISA_conf()
2458 brd->info = &mxser_cards[1]; in mxser_get_ISA_conf()
2461 brd->info = &mxser_cards[2]; in mxser_get_ISA_conf()
2464 brd->info = &mxser_cards[5]; in mxser_get_ISA_conf()
2467 brd->info = &mxser_cards[6]; in mxser_get_ISA_conf()
2470 brd->info = &mxser_cards[7]; in mxser_get_ISA_conf()
2477 /* some ISA cards have 2 ports, but we want to see them as 4-port (why?) in mxser_get_ISA_conf()
2478 Flag-hack checks if configuration should be read as 2-port here. */ in mxser_get_ISA_conf()
2479 if (brd->info->nports == 2 || (brd->info->flags & MXSER_HAS2)) { in mxser_get_ISA_conf()
2484 } else if (brd->info->nports == 4) { in mxser_get_ISA_conf()
2490 } else if (brd->info->nports == 8) { in mxser_get_ISA_conf()
2500 return -EIO; in mxser_get_ISA_conf()
2502 brd->irq = ((int)(irq & 0xF000) >> 12); in mxser_get_ISA_conf()
2504 brd->ports[i].ioaddr = (int) regs[i + 1] & 0xFFF8; in mxser_get_ISA_conf()
2507 return -EIO; in mxser_get_ISA_conf()
2509 brd->vector = (int)regs[11]; /* interrupt vector */ in mxser_get_ISA_conf()
2511 brd->vector_mask = 0x00FF; in mxser_get_ISA_conf()
2513 brd->vector_mask = 0x000F; in mxser_get_ISA_conf()
2514 for (i = 7, bits = 0x0100; i >= 0; i--, bits <<= 1) { in mxser_get_ISA_conf()
2516 brd->ports[i].baud_base = 921600; in mxser_get_ISA_conf()
2517 brd->ports[i].max_baud = 921600; in mxser_get_ISA_conf()
2519 brd->ports[i].baud_base = 115200; in mxser_get_ISA_conf()
2520 brd->ports[i].max_baud = 115200; in mxser_get_ISA_conf()
2531 brd->uart_type = PORT_16550A; in mxser_get_ISA_conf()
2533 brd->uart_type = PORT_16450; in mxser_get_ISA_conf()
2534 if (!request_region(brd->ports[0].ioaddr, 8 * brd->info->nports, in mxser_get_ISA_conf()
2537 "0x%.8lx-0x%.8lx\n", in mxser_get_ISA_conf()
2538 brd->ports[0].ioaddr, brd->ports[0].ioaddr + in mxser_get_ISA_conf()
2539 8 * brd->info->nports - 1); in mxser_get_ISA_conf()
2540 return -EIO; in mxser_get_ISA_conf()
2545 release_region(brd->ports[0].ioaddr, 8 * brd->info->nports); in mxser_get_ISA_conf()
2547 "0x%.8lx-0x%.8lx\n", in mxser_get_ISA_conf()
2548 brd->ports[0].ioaddr, brd->ports[0].ioaddr + in mxser_get_ISA_conf()
2549 8 * brd->info->nports - 1); in mxser_get_ISA_conf()
2552 return brd->info->nports; in mxser_get_ISA_conf()
2556 return -EIO; in mxser_get_ISA_conf()
2567 int retval = -EINVAL; in mxser_probe()
2574 dev_err(&pdev->dev, "too many boards found (maximum %d), board " in mxser_probe()
2580 brd->idx = i * MXSER_PORTS_PER_BOARD; in mxser_probe()
2581 dev_info(&pdev->dev, "found MOXA %s board (BusNo=%d, DevNo=%d)\n", in mxser_probe()
2582 mxser_cards[ent->driver_data].name, in mxser_probe()
2583 pdev->bus->number, PCI_SLOT(pdev->devfn)); in mxser_probe()
2587 dev_err(&pdev->dev, "PCI enable failed\n"); in mxser_probe()
2597 brd->info = &mxser_cards[ent->driver_data]; in mxser_probe()
2598 for (i = 0; i < brd->info->nports; i++) in mxser_probe()
2599 brd->ports[i].ioaddr = ioaddress + 8 * i; in mxser_probe()
2606 brd->vector = ioaddress; in mxser_probe()
2609 brd->irq = pdev->irq; in mxser_probe()
2611 brd->chip_flag = CheckIsMoxaMust(brd->ports[0].ioaddr); in mxser_probe()
2612 brd->uart_type = PORT_16550A; in mxser_probe()
2613 brd->vector_mask = 0; in mxser_probe()
2615 for (i = 0; i < brd->info->nports; i++) { in mxser_probe()
2617 if (Gpci_uart_info[j].type == brd->chip_flag) { in mxser_probe()
2618 brd->ports[i].max_baud = in mxser_probe()
2621 /* exception....CP-102 */ in mxser_probe()
2622 if (brd->info->flags & MXSER_HIGHBAUD) in mxser_probe()
2623 brd->ports[i].max_baud = 921600; in mxser_probe()
2629 if (brd->chip_flag == MOXA_MUST_MU860_HWID) { in mxser_probe()
2630 for (i = 0; i < brd->info->nports; i++) { in mxser_probe()
2632 brd->ports[i].opmode_ioaddr = ioaddress + 4; in mxser_probe()
2634 brd->ports[i].opmode_ioaddr = ioaddress + 0x0c; in mxser_probe()
2640 for (i = 0; i < brd->info->nports; i++) { in mxser_probe()
2641 brd->vector_mask |= (1 << i); in mxser_probe()
2642 brd->ports[i].baud_base = 921600; in mxser_probe()
2650 for (i = 0; i < brd->info->nports; i++) { in mxser_probe()
2651 tty_dev = tty_port_register_device(&brd->ports[i].port, in mxser_probe()
2652 mxvar_sdriver, brd->idx + i, &pdev->dev); in mxser_probe()
2655 for (; i > 0; i--) in mxser_probe()
2657 brd->idx + i - 1); in mxser_probe()
2666 for (i = 0; i < brd->info->nports; i++) in mxser_probe()
2667 tty_port_destroy(&brd->ports[i].port); in mxser_probe()
2668 free_irq(brd->irq, brd); in mxser_probe()
2672 brd->info = NULL; in mxser_probe()
2679 return -ENODEV; in mxser_probe()
2693 brd->info = NULL; in mxser_remove()
2713 return -ENOMEM; in mxser_module_init()
2719 mxvar_sdriver->name = "ttyMI"; in mxser_module_init()
2720 mxvar_sdriver->major = ttymajor; in mxser_module_init()
2721 mxvar_sdriver->minor_start = 0; in mxser_module_init()
2722 mxvar_sdriver->type = TTY_DRIVER_TYPE_SERIAL; in mxser_module_init()
2723 mxvar_sdriver->subtype = SERIAL_TYPE_NORMAL; in mxser_module_init()
2724 mxvar_sdriver->init_termios = tty_std_termios; in mxser_module_init()
2725 mxvar_sdriver->init_termios.c_cflag = B9600|CS8|CREAD|HUPCL|CLOCAL; in mxser_module_init()
2726 mxvar_sdriver->flags = TTY_DRIVER_REAL_RAW|TTY_DRIVER_DYNAMIC_DEV; in mxser_module_init()
2744 brd->info = NULL; in mxser_module_init()
2749 brd->info->name, ioaddr[b]); in mxser_module_init()
2754 brd->info = NULL; in mxser_module_init()
2758 brd->idx = m * MXSER_PORTS_PER_BOARD; in mxser_module_init()
2759 for (i = 0; i < brd->info->nports; i++) { in mxser_module_init()
2760 tty_dev = tty_port_register_device(&brd->ports[i].port, in mxser_module_init()
2761 mxvar_sdriver, brd->idx + i, NULL); in mxser_module_init()
2763 for (; i > 0; i--) in mxser_module_init()
2765 brd->idx + i - 1); in mxser_module_init()
2766 for (i = 0; i < brd->info->nports; i++) in mxser_module_init()
2767 tty_port_destroy(&brd->ports[i].port); in mxser_module_init()
2768 free_irq(brd->irq, brd); in mxser_module_init()
2770 brd->info = NULL; in mxser_module_init()
2774 if (brd->info == NULL) in mxser_module_init()
2784 retval = -ENODEV; in mxser_module_init()