Lines Matching +full:rs485 +full:- +full:enabled +full:- +full:at +full:- +full:boot +full:- +full:time

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()
864 return -ENOMEM; in mxser_activate()
866 spin_lock_irqsave(&info->slock, flags); in mxser_activate()
868 if (!info->ioaddr || !info->type) { in mxser_activate()
869 set_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
871 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
874 info->port.xmit_buf = (unsigned char *) page; in mxser_activate()
880 if (info->board->chip_flag) in mxser_activate()
883 MOXA_MUST_FCR_GDA_MODE_ENABLE), info->ioaddr + UART_FCR); in mxser_activate()
886 info->ioaddr + UART_FCR); in mxser_activate()
889 * At this point there's no way the LSR could still be 0xFF; in mxser_activate()
893 if (inb(info->ioaddr + UART_LSR) == 0xff) { in mxser_activate()
894 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
896 set_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
899 return -ENODEV; in mxser_activate()
905 (void) inb(info->ioaddr + UART_LSR); in mxser_activate()
906 (void) inb(info->ioaddr + UART_RX); in mxser_activate()
907 (void) inb(info->ioaddr + UART_IIR); in mxser_activate()
908 (void) inb(info->ioaddr + UART_MSR); in mxser_activate()
913 outb(UART_LCR_WLEN8, info->ioaddr + UART_LCR); /* reset DLAB */ in mxser_activate()
914 info->MCR = UART_MCR_DTR | UART_MCR_RTS; in mxser_activate()
915 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_activate()
920 info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; in mxser_activate()
922 if (info->board->chip_flag) in mxser_activate()
923 info->IER |= MOXA_MUST_IER_EGDAI; in mxser_activate()
924 outb(info->IER, info->ioaddr + UART_IER); /* enable interrupts */ in mxser_activate()
929 (void) inb(info->ioaddr + UART_LSR); in mxser_activate()
930 (void) inb(info->ioaddr + UART_RX); in mxser_activate()
931 (void) inb(info->ioaddr + UART_IIR); in mxser_activate()
932 (void) inb(info->ioaddr + UART_MSR); in mxser_activate()
934 clear_bit(TTY_IO_ERROR, &tty->flags); in mxser_activate()
935 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; in mxser_activate()
941 spin_unlock_irqrestore(&info->slock, flags); in mxser_activate()
954 spin_lock_irqsave(&info->slock, flags); in mxser_shutdown_port()
960 wake_up_interruptible(&info->port.delta_msr_wait); in mxser_shutdown_port()
965 if (info->port.xmit_buf) { in mxser_shutdown_port()
966 free_page((unsigned long) info->port.xmit_buf); in mxser_shutdown_port()
967 info->port.xmit_buf = NULL; in mxser_shutdown_port()
970 info->IER = 0; in mxser_shutdown_port()
971 outb(0x00, info->ioaddr + UART_IER); in mxser_shutdown_port()
974 if (info->board->chip_flag) in mxser_shutdown_port()
977 info->ioaddr + UART_FCR); in mxser_shutdown_port()
980 info->ioaddr + UART_FCR); in mxser_shutdown_port()
983 (void) inb(info->ioaddr + UART_RX); in mxser_shutdown_port()
986 if (info->board->chip_flag) in mxser_shutdown_port()
987 SET_MOXA_MUST_NO_SOFTWARE_FLOW_CONTROL(info->ioaddr); in mxser_shutdown_port()
989 spin_unlock_irqrestore(&info->slock, flags); in mxser_shutdown_port()
995 * the IRQ chain. It also performs the serial-specific
1003 line = tty->index; in mxser_open()
1007 if (!info->ioaddr) in mxser_open()
1008 return -ENODEV; in mxser_open()
1010 tty->driver_data = info; in mxser_open()
1011 return tty_port_open(&info->port, tty, filp); in mxser_open()
1016 struct mxser_port *info = tty->driver_data; in mxser_flush_buffer()
1021 spin_lock_irqsave(&info->slock, flags); in mxser_flush_buffer()
1022 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; in mxser_flush_buffer()
1024 fcr = inb(info->ioaddr + UART_FCR); in mxser_flush_buffer()
1026 info->ioaddr + UART_FCR); in mxser_flush_buffer()
1027 outb(fcr, info->ioaddr + UART_FCR); in mxser_flush_buffer()
1029 spin_unlock_irqrestore(&info->slock, flags); in mxser_flush_buffer()
1040 * At this point we stop accepting input. To do this, we in mxser_close_port()
1045 info->IER &= ~UART_IER_RLSI; in mxser_close_port()
1046 if (info->board->chip_flag) in mxser_close_port()
1047 info->IER &= ~MOXA_MUST_RECV_ISR; in mxser_close_port()
1049 outb(info->IER, info->ioaddr + UART_IER); in mxser_close_port()
1056 while (!(inb(info->ioaddr + UART_LSR) & UART_LSR_TEMT)) { in mxser_close_port()
1071 struct mxser_port *info = tty->driver_data; in mxser_close()
1072 struct tty_port *port = &info->port; in mxser_close()
1074 if (tty->index == MXSER_PORTS || info == NULL) in mxser_close()
1078 info->closing = 1; in mxser_close()
1079 mutex_lock(&port->mutex); in mxser_close()
1086 mutex_unlock(&port->mutex); in mxser_close()
1087 info->closing = 0; in mxser_close()
1097 struct mxser_port *info = tty->driver_data; in mxser_write()
1100 if (!info->port.xmit_buf) in mxser_write()
1104 c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, in mxser_write()
1105 SERIAL_XMIT_SIZE - info->xmit_head)); in mxser_write()
1109 memcpy(info->port.xmit_buf + info->xmit_head, buf, c); in mxser_write()
1110 spin_lock_irqsave(&info->slock, flags); in mxser_write()
1111 info->xmit_head = (info->xmit_head + c) & in mxser_write()
1112 (SERIAL_XMIT_SIZE - 1); in mxser_write()
1113 info->xmit_cnt += c; in mxser_write()
1114 spin_unlock_irqrestore(&info->slock, flags); in mxser_write()
1117 count -= c; in mxser_write()
1121 if (info->xmit_cnt && !tty->stopped) { in mxser_write()
1122 if (!tty->hw_stopped || in mxser_write()
1123 (info->type == PORT_16550A) || in mxser_write()
1124 (info->board->chip_flag)) { in mxser_write()
1125 spin_lock_irqsave(&info->slock, flags); in mxser_write()
1126 outb(info->IER & ~UART_IER_THRI, info->ioaddr + in mxser_write()
1128 info->IER |= UART_IER_THRI; in mxser_write()
1129 outb(info->IER, info->ioaddr + UART_IER); in mxser_write()
1130 spin_unlock_irqrestore(&info->slock, flags); in mxser_write()
1138 struct mxser_port *info = tty->driver_data; in mxser_put_char()
1141 if (!info->port.xmit_buf) in mxser_put_char()
1144 if (info->xmit_cnt >= SERIAL_XMIT_SIZE - 1) in mxser_put_char()
1147 spin_lock_irqsave(&info->slock, flags); in mxser_put_char()
1148 info->port.xmit_buf[info->xmit_head++] = ch; in mxser_put_char()
1149 info->xmit_head &= SERIAL_XMIT_SIZE - 1; in mxser_put_char()
1150 info->xmit_cnt++; in mxser_put_char()
1151 spin_unlock_irqrestore(&info->slock, flags); in mxser_put_char()
1152 if (!tty->stopped) { in mxser_put_char()
1153 if (!tty->hw_stopped || in mxser_put_char()
1154 (info->type == PORT_16550A) || in mxser_put_char()
1155 info->board->chip_flag) { in mxser_put_char()
1156 spin_lock_irqsave(&info->slock, flags); in mxser_put_char()
1157 outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER); in mxser_put_char()
1158 info->IER |= UART_IER_THRI; in mxser_put_char()
1159 outb(info->IER, info->ioaddr + UART_IER); in mxser_put_char()
1160 spin_unlock_irqrestore(&info->slock, flags); in mxser_put_char()
1169 struct mxser_port *info = tty->driver_data; in mxser_flush_chars()
1172 if (info->xmit_cnt <= 0 || tty->stopped || !info->port.xmit_buf || in mxser_flush_chars()
1173 (tty->hw_stopped && info->type != PORT_16550A && in mxser_flush_chars()
1174 !info->board->chip_flag)) in mxser_flush_chars()
1177 spin_lock_irqsave(&info->slock, flags); in mxser_flush_chars()
1179 outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER); in mxser_flush_chars()
1180 info->IER |= UART_IER_THRI; in mxser_flush_chars()
1181 outb(info->IER, info->ioaddr + UART_IER); in mxser_flush_chars()
1183 spin_unlock_irqrestore(&info->slock, flags); in mxser_flush_chars()
1188 struct mxser_port *info = tty->driver_data; in mxser_write_room()
1191 ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1; in mxser_write_room()
1197 struct mxser_port *info = tty->driver_data; in mxser_chars_in_buffer()
1198 return info->xmit_cnt; in mxser_chars_in_buffer()
1202 * ------------------------------------------------------------
1204 * ------------------------------------------------------------
1209 struct mxser_port *info = tty->driver_data; in mxser_get_serial_info()
1210 struct tty_port *port = &info->port; in mxser_get_serial_info()
1212 if (tty->index == MXSER_PORTS) in mxser_get_serial_info()
1213 return -ENOTTY; in mxser_get_serial_info()
1215 mutex_lock(&port->mutex); in mxser_get_serial_info()
1216 ss->type = info->type, in mxser_get_serial_info()
1217 ss->line = tty->index, in mxser_get_serial_info()
1218 ss->port = info->ioaddr, in mxser_get_serial_info()
1219 ss->irq = info->board->irq, in mxser_get_serial_info()
1220 ss->flags = info->port.flags, in mxser_get_serial_info()
1221 ss->baud_base = info->baud_base, in mxser_get_serial_info()
1222 ss->close_delay = info->port.close_delay, in mxser_get_serial_info()
1223 ss->closing_wait = info->port.closing_wait, in mxser_get_serial_info()
1224 ss->custom_divisor = info->custom_divisor, in mxser_get_serial_info()
1225 mutex_unlock(&port->mutex); in mxser_get_serial_info()
1232 struct mxser_port *info = tty->driver_data; in mxser_set_serial_info()
1233 struct tty_port *port = &info->port; in mxser_set_serial_info()
1239 if (tty->index == MXSER_PORTS) in mxser_set_serial_info()
1240 return -ENOTTY; in mxser_set_serial_info()
1242 return -EIO; in mxser_set_serial_info()
1244 mutex_lock(&port->mutex); in mxser_set_serial_info()
1245 if (!info->ioaddr) { in mxser_set_serial_info()
1246 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1247 return -ENODEV; in mxser_set_serial_info()
1250 if (ss->irq != info->board->irq || in mxser_set_serial_info()
1251 ss->port != info->ioaddr) { in mxser_set_serial_info()
1252 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1253 return -EINVAL; in mxser_set_serial_info()
1256 flags = port->flags & ASYNC_SPD_MASK; in mxser_set_serial_info()
1259 if ((ss->baud_base != info->baud_base) || in mxser_set_serial_info()
1260 (ss->close_delay != info->port.close_delay) || in mxser_set_serial_info()
1261 ((ss->flags & ~ASYNC_USR_MASK) != (info->port.flags & ~ASYNC_USR_MASK))) { in mxser_set_serial_info()
1262 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1263 return -EPERM; in mxser_set_serial_info()
1265 info->port.flags = ((info->port.flags & ~ASYNC_USR_MASK) | in mxser_set_serial_info()
1266 (ss->flags & ASYNC_USR_MASK)); in mxser_set_serial_info()
1270 * At this point, we start making changes..... in mxser_set_serial_info()
1272 port->flags = ((port->flags & ~ASYNC_FLAGS) | in mxser_set_serial_info()
1273 (ss->flags & ASYNC_FLAGS)); in mxser_set_serial_info()
1274 port->close_delay = ss->close_delay * HZ / 100; in mxser_set_serial_info()
1275 port->closing_wait = ss->closing_wait * HZ / 100; in mxser_set_serial_info()
1276 port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0; in mxser_set_serial_info()
1277 if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST && in mxser_set_serial_info()
1278 (ss->baud_base != info->baud_base || in mxser_set_serial_info()
1279 ss->custom_divisor != in mxser_set_serial_info()
1280 info->custom_divisor)) { in mxser_set_serial_info()
1281 if (ss->custom_divisor == 0) { in mxser_set_serial_info()
1282 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1283 return -EINVAL; in mxser_set_serial_info()
1285 baud = ss->baud_base / ss->custom_divisor; in mxser_set_serial_info()
1290 info->type = ss->type; in mxser_set_serial_info()
1295 if (flags != (port->flags & ASYNC_SPD_MASK)) { in mxser_set_serial_info()
1296 spin_lock_irqsave(&info->slock, sl_flags); in mxser_set_serial_info()
1298 spin_unlock_irqrestore(&info->slock, sl_flags); in mxser_set_serial_info()
1305 mutex_unlock(&port->mutex); in mxser_set_serial_info()
1310 * mxser_get_lsr_info - get line status register info
1313 * is emptied. On bus types like RS485, the transmitter must
1317 * allows an RS485 driver to be written in user space.
1326 spin_lock_irqsave(&info->slock, flags); in mxser_get_lsr_info()
1327 status = inb(info->ioaddr + UART_LSR); in mxser_get_lsr_info()
1328 spin_unlock_irqrestore(&info->slock, flags); in mxser_get_lsr_info()
1335 struct mxser_port *info = tty->driver_data; in mxser_tiocmget()
1340 if (tty->index == MXSER_PORTS) in mxser_tiocmget()
1341 return -ENOIOCTLCMD; in mxser_tiocmget()
1343 return -EIO; in mxser_tiocmget()
1345 control = info->MCR; in mxser_tiocmget()
1347 spin_lock_irqsave(&info->slock, flags); in mxser_tiocmget()
1348 status = inb(info->ioaddr + UART_MSR); in mxser_tiocmget()
1351 spin_unlock_irqrestore(&info->slock, flags); in mxser_tiocmget()
1363 struct mxser_port *info = tty->driver_data; in mxser_tiocmset()
1367 if (tty->index == MXSER_PORTS) in mxser_tiocmset()
1368 return -ENOIOCTLCMD; in mxser_tiocmset()
1370 return -EIO; in mxser_tiocmset()
1372 spin_lock_irqsave(&info->slock, flags); in mxser_tiocmset()
1375 info->MCR |= UART_MCR_RTS; in mxser_tiocmset()
1377 info->MCR |= UART_MCR_DTR; in mxser_tiocmset()
1380 info->MCR &= ~UART_MCR_RTS; in mxser_tiocmset()
1382 info->MCR &= ~UART_MCR_DTR; in mxser_tiocmset()
1384 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_tiocmset()
1385 spin_unlock_irqrestore(&info->slock, flags); in mxser_tiocmset()
1408 return -1; in mxser_program_mode()
1420 id = -2; in mxser_program_mode()
1505 current->comm, cmd); in mxser_ioctl_special()
1516 /* The receive side is locked by port->slock but it isn't in mxser_ioctl_special()
1519 ret = -EFAULT; in mxser_ioctl_special()
1526 port = &ip->port; in mxser_ioctl_special()
1529 mutex_lock(&port->mutex); in mxser_ioctl_special()
1530 if (!ip->ioaddr) in mxser_ioctl_special()
1536 ms.cflag = ip->normal_termios.c_cflag; in mxser_ioctl_special()
1538 ms.cflag = tty->termios.c_cflag; in mxser_ioctl_special()
1540 spin_lock_irq(&ip->slock); in mxser_ioctl_special()
1541 status = inb(ip->ioaddr + UART_MSR); in mxser_ioctl_special()
1542 spin_unlock_irq(&ip->slock); in mxser_ioctl_special()
1550 mutex_unlock(&port->mutex); in mxser_ioctl_special()
1552 return -EFAULT; in mxser_ioctl_special()
1564 return -ENOMEM; in mxser_ioctl_special()
1568 if (p >= ARRAY_SIZE(me->rx_cnt)) { in mxser_ioctl_special()
1573 port = &ip->port; in mxser_ioctl_special()
1575 mutex_lock(&port->mutex); in mxser_ioctl_special()
1576 if (!ip->ioaddr) { in mxser_ioctl_special()
1577 mutex_unlock(&port->mutex); in mxser_ioctl_special()
1581 spin_lock_irq(&ip->slock); in mxser_ioctl_special()
1582 status = mxser_get_msr(ip->ioaddr, 0, p); in mxser_ioctl_special()
1585 ip->icount.rng++; in mxser_ioctl_special()
1587 ip->icount.dsr++; in mxser_ioctl_special()
1589 ip->icount.dcd++; in mxser_ioctl_special()
1591 ip->icount.cts++; in mxser_ioctl_special()
1593 ip->mon_data.modem_status = status; in mxser_ioctl_special()
1594 me->rx_cnt[p] = ip->mon_data.rxcnt; in mxser_ioctl_special()
1595 me->tx_cnt[p] = ip->mon_data.txcnt; in mxser_ioctl_special()
1596 me->up_rxcnt[p] = ip->mon_data.up_rxcnt; in mxser_ioctl_special()
1597 me->up_txcnt[p] = ip->mon_data.up_txcnt; in mxser_ioctl_special()
1598 me->modem_status[p] = in mxser_ioctl_special()
1599 ip->mon_data.modem_status; in mxser_ioctl_special()
1600 spin_unlock_irq(&ip->slock); in mxser_ioctl_special()
1602 tty = tty_port_tty_get(&ip->port); in mxser_ioctl_special()
1605 cflag = ip->normal_termios.c_cflag; in mxser_ioctl_special()
1606 iflag = ip->normal_termios.c_iflag; in mxser_ioctl_special()
1607 me->baudrate[p] = tty_termios_baud_rate(&ip->normal_termios); in mxser_ioctl_special()
1609 cflag = tty->termios.c_cflag; in mxser_ioctl_special()
1610 iflag = tty->termios.c_iflag; in mxser_ioctl_special()
1611 me->baudrate[p] = tty_get_baud_rate(tty); in mxser_ioctl_special()
1615 me->databits[p] = cflag & CSIZE; in mxser_ioctl_special()
1616 me->stopbits[p] = cflag & CSTOPB; in mxser_ioctl_special()
1617 me->parity[p] = cflag & (PARENB | PARODD | in mxser_ioctl_special()
1621 me->flowctrl[p] |= 0x03; in mxser_ioctl_special()
1624 me->flowctrl[p] |= 0x0C; in mxser_ioctl_special()
1626 if (ip->type == PORT_16550A) in mxser_ioctl_special()
1627 me->fifo[p] = 1; in mxser_ioctl_special()
1629 if (ip->board->chip_flag == MOXA_MUST_MU860_HWID) { in mxser_ioctl_special()
1630 opmode = inb(ip->opmode_ioaddr)>>((p % 4) * 2); in mxser_ioctl_special()
1635 me->iftype[p] = opmode; in mxser_ioctl_special()
1636 mutex_unlock(&port->mutex); in mxser_ioctl_special()
1640 ret = -EFAULT; in mxser_ioctl_special()
1645 return -ENOIOCTLCMD; in mxser_ioctl_special()
1657 spin_lock_irqsave(&info->slock, flags); in mxser_cflags_changed()
1658 cnow = info->icount; /* atomic copy */ in mxser_cflags_changed()
1659 spin_unlock_irqrestore(&info->slock, flags); in mxser_cflags_changed()
1661 ret = ((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) || in mxser_cflags_changed()
1662 ((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) || in mxser_cflags_changed()
1663 ((arg & TIOCM_CD) && (cnow.dcd != cprev->dcd)) || in mxser_cflags_changed()
1664 ((arg & TIOCM_CTS) && (cnow.cts != cprev->cts)); in mxser_cflags_changed()
1674 struct mxser_port *info = tty->driver_data; in mxser_ioctl()
1679 if (tty->index == MXSER_PORTS) in mxser_ioctl()
1689 if (info->board->chip_flag != MOXA_MUST_MU860_HWID) in mxser_ioctl()
1690 return -EFAULT; in mxser_ioctl()
1692 p = tty->index % 4; in mxser_ioctl()
1695 return -EFAULT; in mxser_ioctl()
1700 return -EFAULT; in mxser_ioctl()
1703 spin_lock_irq(&info->slock); in mxser_ioctl()
1704 val = inb(info->opmode_ioaddr); in mxser_ioctl()
1707 outb(val, info->opmode_ioaddr); in mxser_ioctl()
1708 spin_unlock_irq(&info->slock); in mxser_ioctl()
1711 spin_lock_irq(&info->slock); in mxser_ioctl()
1712 opmode = inb(info->opmode_ioaddr) >> shiftbit; in mxser_ioctl()
1713 spin_unlock_irq(&info->slock); in mxser_ioctl()
1716 return -EFAULT; in mxser_ioctl()
1722 return -EIO; in mxser_ioctl()
1729 * - mask passed in arg for lines of interest in mxser_ioctl()
1734 spin_lock_irqsave(&info->slock, flags); in mxser_ioctl()
1735 cnow = info->icount; /* note the counters on entry */ in mxser_ioctl()
1736 spin_unlock_irqrestore(&info->slock, flags); in mxser_ioctl()
1738 return wait_event_interruptible(info->port.delta_msr_wait, in mxser_ioctl()
1741 return put_user(info->baud_base != 115200 ? 1 : 0, (int __user *)argp); in mxser_ioctl()
1743 spin_lock_irq(&info->slock); in mxser_ioctl()
1744 info->mon_data.rxcnt = 0; in mxser_ioctl()
1745 info->mon_data.txcnt = 0; in mxser_ioctl()
1746 spin_unlock_irq(&info->slock); in mxser_ioctl()
1753 spin_lock_irq(&info->slock); in mxser_ioctl()
1754 lsr = inb(info->ioaddr + UART_LSR) & UART_LSR_THRE; in mxser_ioctl()
1755 spin_unlock_irq(&info->slock); in mxser_ioctl()
1763 spin_lock_irq(&info->slock); in mxser_ioctl()
1764 status = mxser_get_msr(info->ioaddr, 1, tty->index); in mxser_ioctl()
1767 mcr = inb(info->ioaddr + UART_MCR); in mxser_ioctl()
1768 spin_unlock_irq(&info->slock); in mxser_ioctl()
1771 info->mon_data.hold_reason &= ~NPPI_NOTIFY_XOFFHOLD; in mxser_ioctl()
1773 info->mon_data.hold_reason |= NPPI_NOTIFY_XOFFHOLD; in mxser_ioctl()
1776 info->mon_data.hold_reason &= ~NPPI_NOTIFY_XOFFXENT; in mxser_ioctl()
1778 info->mon_data.hold_reason |= NPPI_NOTIFY_XOFFXENT; in mxser_ioctl()
1780 if (tty->hw_stopped) in mxser_ioctl()
1781 info->mon_data.hold_reason |= NPPI_NOTIFY_CTSHOLD; in mxser_ioctl()
1783 info->mon_data.hold_reason &= ~NPPI_NOTIFY_CTSHOLD; in mxser_ioctl()
1785 if (copy_to_user(argp, &info->mon_data, in mxser_ioctl()
1787 return -EFAULT; in mxser_ioctl()
1792 if (put_user(info->err_shadow, (unsigned char __user *)argp)) in mxser_ioctl()
1793 return -EFAULT; in mxser_ioctl()
1795 info->err_shadow = 0; in mxser_ioctl()
1802 return -EFAULT; in mxser_ioctl()
1803 mxser_set_baud_method[tty->index] = method; in mxser_ioctl()
1807 return -ENOIOCTLCMD; in mxser_ioctl()
1815 * NB: both 1->0 and 0->1 transitions are counted except for
1816 * RI where only 0->1 is counted.
1823 struct mxser_port *info = tty->driver_data; in mxser_get_icount()
1827 spin_lock_irqsave(&info->slock, flags); in mxser_get_icount()
1828 cnow = info->icount; in mxser_get_icount()
1829 spin_unlock_irqrestore(&info->slock, flags); in mxser_get_icount()
1831 icount->frame = cnow.frame; in mxser_get_icount()
1832 icount->brk = cnow.brk; in mxser_get_icount()
1833 icount->overrun = cnow.overrun; in mxser_get_icount()
1834 icount->buf_overrun = cnow.buf_overrun; in mxser_get_icount()
1835 icount->parity = cnow.parity; in mxser_get_icount()
1836 icount->rx = cnow.rx; in mxser_get_icount()
1837 icount->tx = cnow.tx; in mxser_get_icount()
1838 icount->cts = cnow.cts; in mxser_get_icount()
1839 icount->dsr = cnow.dsr; in mxser_get_icount()
1840 icount->rng = cnow.rng; in mxser_get_icount()
1841 icount->dcd = cnow.dcd; in mxser_get_icount()
1847 struct mxser_port *info = tty->driver_data; in mxser_stoprx()
1849 info->ldisc_stop_rx = 1; in mxser_stoprx()
1851 if (info->board->chip_flag) { in mxser_stoprx()
1852 info->IER &= ~MOXA_MUST_RECV_ISR; in mxser_stoprx()
1853 outb(info->IER, info->ioaddr + UART_IER); in mxser_stoprx()
1855 info->x_char = STOP_CHAR(tty); in mxser_stoprx()
1856 outb(0, info->ioaddr + UART_IER); in mxser_stoprx()
1857 info->IER |= UART_IER_THRI; in mxser_stoprx()
1858 outb(info->IER, info->ioaddr + UART_IER); in mxser_stoprx()
1863 info->MCR &= ~UART_MCR_RTS; in mxser_stoprx()
1864 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_stoprx()
1869 * This routine is called by the upper-layer tty layer to signal that
1879 struct mxser_port *info = tty->driver_data; in mxser_unthrottle()
1882 info->ldisc_stop_rx = 0; in mxser_unthrottle()
1884 if (info->x_char) in mxser_unthrottle()
1885 info->x_char = 0; in mxser_unthrottle()
1887 if (info->board->chip_flag) { in mxser_unthrottle()
1888 info->IER |= MOXA_MUST_RECV_ISR; in mxser_unthrottle()
1889 outb(info->IER, info->ioaddr + UART_IER); in mxser_unthrottle()
1891 info->x_char = START_CHAR(tty); in mxser_unthrottle()
1892 outb(0, info->ioaddr + UART_IER); in mxser_unthrottle()
1893 info->IER |= UART_IER_THRI; in mxser_unthrottle()
1894 outb(info->IER, info->ioaddr + UART_IER); in mxser_unthrottle()
1900 info->MCR |= UART_MCR_RTS; in mxser_unthrottle()
1901 outb(info->MCR, info->ioaddr + UART_MCR); in mxser_unthrottle()
1908 * This routines are called before setting or resetting tty->stopped.
1913 struct mxser_port *info = tty->driver_data; in mxser_stop()
1916 spin_lock_irqsave(&info->slock, flags); in mxser_stop()
1917 if (info->IER & UART_IER_THRI) { in mxser_stop()
1918 info->IER &= ~UART_IER_THRI; in mxser_stop()
1919 outb(info->IER, info->ioaddr + UART_IER); in mxser_stop()
1921 spin_unlock_irqrestore(&info->slock, flags); in mxser_stop()
1926 struct mxser_port *info = tty->driver_data; in mxser_start()
1929 spin_lock_irqsave(&info->slock, flags); in mxser_start()
1930 if (info->xmit_cnt && info->port.xmit_buf) { in mxser_start()
1931 outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER); in mxser_start()
1932 info->IER |= UART_IER_THRI; in mxser_start()
1933 outb(info->IER, info->ioaddr + UART_IER); in mxser_start()
1935 spin_unlock_irqrestore(&info->slock, flags); in mxser_start()
1940 struct mxser_port *info = tty->driver_data; in mxser_set_termios()
1943 spin_lock_irqsave(&info->slock, flags); in mxser_set_termios()
1945 spin_unlock_irqrestore(&info->slock, flags); in mxser_set_termios()
1947 if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) { in mxser_set_termios()
1948 tty->hw_stopped = 0; in mxser_set_termios()
1953 if ((old_termios->c_iflag & IXON) && !I_IXON(tty)) { in mxser_set_termios()
1954 tty->stopped = 0; in mxser_set_termios()
1956 if (info->board->chip_flag) { in mxser_set_termios()
1957 spin_lock_irqsave(&info->slock, flags); in mxser_set_termios()
1959 info->ioaddr); in mxser_set_termios()
1960 spin_unlock_irqrestore(&info->slock, flags); in mxser_set_termios()
1968 * mxser_wait_until_sent() --- wait until the transmitter is empty
1972 struct mxser_port *info = tty->driver_data; in mxser_wait_until_sent()
1977 if (info->type == PORT_UNKNOWN) in mxser_wait_until_sent()
1980 if (info->xmit_fifo_size == 0) in mxser_wait_until_sent()
1985 * Set the check interval to be 1/5 of the estimated time to in mxser_wait_until_sent()
1986 * send a single character, and make it at least 1. The check in mxser_wait_until_sent()
1990 * the NIST-PCTS. in mxser_wait_until_sent()
1992 char_time = (info->timeout - HZ / 50) / info->xmit_fifo_size; in mxser_wait_until_sent()
2000 * amount of time to send the entire FIFO, it probably won't in mxser_wait_until_sent()
2003 * takes longer than info->timeout, this is probably due to a in mxser_wait_until_sent()
2004 * UART bug of some kind. So, we clamp the timeout parameter at in mxser_wait_until_sent()
2005 * 2*info->timeout. in mxser_wait_until_sent()
2007 if (!timeout || timeout > 2 * info->timeout) in mxser_wait_until_sent()
2008 timeout = 2 * info->timeout; in mxser_wait_until_sent()
2010 spin_lock_irqsave(&info->slock, flags); in mxser_wait_until_sent()
2011 while (!((lsr = inb(info->ioaddr + UART_LSR)) & UART_LSR_TEMT)) { in mxser_wait_until_sent()
2012 spin_unlock_irqrestore(&info->slock, flags); in mxser_wait_until_sent()
2014 spin_lock_irqsave(&info->slock, flags); in mxser_wait_until_sent()
2020 spin_unlock_irqrestore(&info->slock, flags); in mxser_wait_until_sent()
2029 struct mxser_port *info = tty->driver_data; in mxser_hangup()
2032 tty_port_hangup(&info->port); in mxser_hangup()
2036 * mxser_rs_break() --- routine which turns the break handling on or off
2040 struct mxser_port *info = tty->driver_data; in mxser_rs_break()
2043 spin_lock_irqsave(&info->slock, flags); in mxser_rs_break()
2044 if (break_state == -1) in mxser_rs_break()
2045 outb(inb(info->ioaddr + UART_LCR) | UART_LCR_SBC, in mxser_rs_break()
2046 info->ioaddr + UART_LCR); in mxser_rs_break()
2048 outb(inb(info->ioaddr + UART_LCR) & ~UART_LCR_SBC, in mxser_rs_break()
2049 info->ioaddr + UART_LCR); in mxser_rs_break()
2050 spin_unlock_irqrestore(&info->slock, flags); in mxser_rs_break()
2063 recv_room = tty->receive_room; in mxser_receive_chars()
2064 if (recv_room == 0 && !port->ldisc_stop_rx) in mxser_receive_chars()
2066 if (port->board->chip_flag != MOXA_OTHER_UART) { in mxser_receive_chars()
2070 if (port->board->chip_flag == MOXA_MUST_MU860_HWID && in mxser_receive_chars()
2076 gdl = inb(port->ioaddr + MOXA_MUST_GDL_REGISTER); in mxser_receive_chars()
2078 if (port->board->chip_flag == MOXA_MUST_MU150_HWID) in mxser_receive_chars()
2081 if (!port->ldisc_stop_rx) in mxser_receive_chars()
2084 while (gdl--) { in mxser_receive_chars()
2085 ch = inb(port->ioaddr + UART_RX); in mxser_receive_chars()
2086 tty_insert_flip_char(&port->port, ch, 0); in mxser_receive_chars()
2094 if (max-- < 0) in mxser_receive_chars()
2097 ch = inb(port->ioaddr + UART_RX); in mxser_receive_chars()
2098 if (port->board->chip_flag && (*status & UART_LSR_OE)) in mxser_receive_chars()
2099 outb(0x23, port->ioaddr + UART_FCR); in mxser_receive_chars()
2100 *status &= port->read_status_mask; in mxser_receive_chars()
2101 if (*status & port->ignore_status_mask) { in mxser_receive_chars()
2109 port->icount.brk++; in mxser_receive_chars()
2111 if (port->port.flags & ASYNC_SAK) in mxser_receive_chars()
2115 port->icount.parity++; in mxser_receive_chars()
2118 port->icount.frame++; in mxser_receive_chars()
2121 port->icount.overrun++; in mxser_receive_chars()
2125 tty_insert_flip_char(&port->port, ch, flag); in mxser_receive_chars()
2128 if (!port->ldisc_stop_rx) in mxser_receive_chars()
2135 if (port->board->chip_flag) in mxser_receive_chars()
2138 *status = inb(port->ioaddr + UART_LSR); in mxser_receive_chars()
2142 mxvar_log.rxcnt[tty->index] += cnt; in mxser_receive_chars()
2143 port->mon_data.rxcnt += cnt; in mxser_receive_chars()
2144 port->mon_data.up_rxcnt += cnt; in mxser_receive_chars()
2147 * We are called from an interrupt context with &port->slock in mxser_receive_chars()
2151 spin_unlock(&port->slock); in mxser_receive_chars()
2152 tty_flip_buffer_push(&port->port); in mxser_receive_chars()
2153 spin_lock(&port->slock); in mxser_receive_chars()
2160 if (port->x_char) { in mxser_transmit_chars()
2161 outb(port->x_char, port->ioaddr + UART_TX); in mxser_transmit_chars()
2162 port->x_char = 0; in mxser_transmit_chars()
2163 mxvar_log.txcnt[tty->index]++; in mxser_transmit_chars()
2164 port->mon_data.txcnt++; in mxser_transmit_chars()
2165 port->mon_data.up_txcnt++; in mxser_transmit_chars()
2166 port->icount.tx++; in mxser_transmit_chars()
2170 if (port->port.xmit_buf == NULL) in mxser_transmit_chars()
2173 if (port->xmit_cnt <= 0 || tty->stopped || in mxser_transmit_chars()
2174 (tty->hw_stopped && in mxser_transmit_chars()
2175 (port->type != PORT_16550A) && in mxser_transmit_chars()
2176 (!port->board->chip_flag))) { in mxser_transmit_chars()
2177 port->IER &= ~UART_IER_THRI; in mxser_transmit_chars()
2178 outb(port->IER, port->ioaddr + UART_IER); in mxser_transmit_chars()
2182 cnt = port->xmit_cnt; in mxser_transmit_chars()
2183 count = port->xmit_fifo_size; in mxser_transmit_chars()
2185 outb(port->port.xmit_buf[port->xmit_tail++], in mxser_transmit_chars()
2186 port->ioaddr + UART_TX); in mxser_transmit_chars()
2187 port->xmit_tail = port->xmit_tail & (SERIAL_XMIT_SIZE - 1); in mxser_transmit_chars()
2188 if (--port->xmit_cnt <= 0) in mxser_transmit_chars()
2190 } while (--count > 0); in mxser_transmit_chars()
2191 mxvar_log.txcnt[tty->index] += (cnt - port->xmit_cnt); in mxser_transmit_chars()
2193 port->mon_data.txcnt += (cnt - port->xmit_cnt); in mxser_transmit_chars()
2194 port->mon_data.up_txcnt += (cnt - port->xmit_cnt); in mxser_transmit_chars()
2195 port->icount.tx += (cnt - port->xmit_cnt); in mxser_transmit_chars()
2197 if (port->xmit_cnt < WAKEUP_CHARS) in mxser_transmit_chars()
2200 if (port->xmit_cnt <= 0) { in mxser_transmit_chars()
2201 port->IER &= ~UART_IER_THRI; in mxser_transmit_chars()
2202 outb(port->IER, port->ioaddr + UART_IER); in mxser_transmit_chars()
2229 max = brd->info->nports; in mxser_interrupt()
2231 irqbits = inb(brd->vector) & brd->vector_mask; in mxser_interrupt()
2232 if (irqbits == brd->vector_mask) in mxser_interrupt()
2237 if (irqbits == brd->vector_mask) in mxser_interrupt()
2241 port = &brd->ports[i]; in mxser_interrupt()
2244 spin_lock(&port->slock); in mxser_interrupt()
2246 iir = inb(port->ioaddr + UART_IIR); in mxser_interrupt()
2250 tty = tty_port_tty_get(&port->port); in mxser_interrupt()
2251 if (!tty || port->closing || in mxser_interrupt()
2252 !tty_port_initialized(&port->port)) { in mxser_interrupt()
2253 status = inb(port->ioaddr + UART_LSR); in mxser_interrupt()
2254 outb(0x27, port->ioaddr + UART_FCR); in mxser_interrupt()
2255 inb(port->ioaddr + UART_MSR); in mxser_interrupt()
2260 status = inb(port->ioaddr + UART_LSR); in mxser_interrupt()
2263 port->err_shadow |= NPPI_NOTIFY_PARITY; in mxser_interrupt()
2265 port->err_shadow |= NPPI_NOTIFY_FRAMING; in mxser_interrupt()
2267 port->err_shadow |= in mxser_interrupt()
2270 port->err_shadow |= NPPI_NOTIFY_BREAK; in mxser_interrupt()
2272 if (port->board->chip_flag) { in mxser_interrupt()
2281 status &= port->read_status_mask; in mxser_interrupt()
2286 msr = inb(port->ioaddr + UART_MSR); in mxser_interrupt()
2290 if (port->board->chip_flag) { in mxser_interrupt()
2300 spin_unlock(&port->slock); in mxser_interrupt()
2341 * The MOXA Smartio/Industio serial driver boot-time initialization code!
2351 brd->vector >= brd->ports[0].ioaddr && in mxser_overlapping_vector()
2352 brd->vector < brd->ports[0].ioaddr + 8 * brd->info->nports; in mxser_overlapping_vector()
2359 return request_region(brd->vector, 1, "mxser(vector)") ? 0 : -EIO; in mxser_request_vector()
2366 release_region(brd->vector, 1); in mxser_release_vector()
2371 release_region(brd->ports[0].ioaddr, 8 * brd->info->nports); in mxser_release_ISA_res()
2382 brd->ports[0].max_baud); in mxser_initbrd()
2384 for (i = 0; i < brd->info->nports; i++) { in mxser_initbrd()
2385 info = &brd->ports[i]; in mxser_initbrd()
2386 tty_port_init(&info->port); in mxser_initbrd()
2387 info->port.ops = &mxser_port_ops; in mxser_initbrd()
2388 info->board = brd; in mxser_initbrd()
2389 info->stop_rx = 0; in mxser_initbrd()
2390 info->ldisc_stop_rx = 0; in mxser_initbrd()
2392 /* Enhance mode enabled here */ in mxser_initbrd()
2393 if (brd->chip_flag != MOXA_OTHER_UART) in mxser_initbrd()
2394 mxser_enable_must_enchance_mode(info->ioaddr); in mxser_initbrd()
2396 info->type = brd->uart_type; in mxser_initbrd()
2400 info->custom_divisor = info->baud_base * 16; in mxser_initbrd()
2401 info->port.close_delay = 5 * HZ / 10; in mxser_initbrd()
2402 info->port.closing_wait = 30 * HZ; in mxser_initbrd()
2403 info->normal_termios = mxvar_sdriver->init_termios; in mxser_initbrd()
2404 memset(&info->mon_data, 0, sizeof(struct mxser_mon)); in mxser_initbrd()
2405 info->err_shadow = 0; in mxser_initbrd()
2406 spin_lock_init(&info->slock); in mxser_initbrd()
2409 outb(inb(info->ioaddr + UART_IER) & 0xf0, in mxser_initbrd()
2410 info->ioaddr + UART_IER); in mxser_initbrd()
2413 retval = request_irq(brd->irq, mxser_interrupt, IRQF_SHARED, "mxser", in mxser_initbrd()
2416 for (i = 0; i < brd->info->nports; i++) in mxser_initbrd()
2417 tty_port_destroy(&brd->ports[i].port); in mxser_initbrd()
2420 brd->info->name, brd->irq); in mxser_initbrd()
2430 for (i = 0; i < brd->info->nports; i++) { in mxser_board_remove()
2431 tty_unregister_device(mxvar_sdriver, brd->idx + i); in mxser_board_remove()
2432 tty_port_destroy(&brd->ports[i].port); in mxser_board_remove()
2434 free_irq(brd->irq, brd); in mxser_board_remove()
2443 brd->chip_flag = MOXA_OTHER_UART; in mxser_get_ISA_conf()
2448 brd->info = &mxser_cards[0]; in mxser_get_ISA_conf()
2451 brd->info = &mxser_cards[1]; in mxser_get_ISA_conf()
2454 brd->info = &mxser_cards[2]; in mxser_get_ISA_conf()
2457 brd->info = &mxser_cards[5]; in mxser_get_ISA_conf()
2460 brd->info = &mxser_cards[6]; in mxser_get_ISA_conf()
2463 brd->info = &mxser_cards[7]; in mxser_get_ISA_conf()
2470 /* some ISA cards have 2 ports, but we want to see them as 4-port (why?) in mxser_get_ISA_conf()
2471 Flag-hack checks if configuration should be read as 2-port here. */ in mxser_get_ISA_conf()
2472 if (brd->info->nports == 2 || (brd->info->flags & MXSER_HAS2)) { in mxser_get_ISA_conf()
2477 } else if (brd->info->nports == 4) { in mxser_get_ISA_conf()
2483 } else if (brd->info->nports == 8) { in mxser_get_ISA_conf()
2493 return -EIO; in mxser_get_ISA_conf()
2495 brd->irq = ((int)(irq & 0xF000) >> 12); in mxser_get_ISA_conf()
2497 brd->ports[i].ioaddr = (int) regs[i + 1] & 0xFFF8; in mxser_get_ISA_conf()
2500 return -EIO; in mxser_get_ISA_conf()
2502 brd->vector = (int)regs[11]; /* interrupt vector */ in mxser_get_ISA_conf()
2504 brd->vector_mask = 0x00FF; in mxser_get_ISA_conf()
2506 brd->vector_mask = 0x000F; in mxser_get_ISA_conf()
2507 for (i = 7, bits = 0x0100; i >= 0; i--, bits <<= 1) { in mxser_get_ISA_conf()
2509 brd->ports[i].baud_base = 921600; in mxser_get_ISA_conf()
2510 brd->ports[i].max_baud = 921600; in mxser_get_ISA_conf()
2512 brd->ports[i].baud_base = 115200; in mxser_get_ISA_conf()
2513 brd->ports[i].max_baud = 115200; in mxser_get_ISA_conf()
2524 brd->uart_type = PORT_16550A; in mxser_get_ISA_conf()
2526 brd->uart_type = PORT_16450; in mxser_get_ISA_conf()
2527 if (!request_region(brd->ports[0].ioaddr, 8 * brd->info->nports, in mxser_get_ISA_conf()
2530 "0x%.8lx-0x%.8lx\n", in mxser_get_ISA_conf()
2531 brd->ports[0].ioaddr, brd->ports[0].ioaddr + in mxser_get_ISA_conf()
2532 8 * brd->info->nports - 1); in mxser_get_ISA_conf()
2533 return -EIO; in mxser_get_ISA_conf()
2538 release_region(brd->ports[0].ioaddr, 8 * brd->info->nports); in mxser_get_ISA_conf()
2540 "0x%.8lx-0x%.8lx\n", in mxser_get_ISA_conf()
2541 brd->ports[0].ioaddr, brd->ports[0].ioaddr + in mxser_get_ISA_conf()
2542 8 * brd->info->nports - 1); in mxser_get_ISA_conf()
2545 return brd->info->nports; in mxser_get_ISA_conf()
2549 return -EIO; in mxser_get_ISA_conf()
2560 int retval = -EINVAL; in mxser_probe()
2567 dev_err(&pdev->dev, "too many boards found (maximum %d), board " in mxser_probe()
2573 brd->idx = i * MXSER_PORTS_PER_BOARD; in mxser_probe()
2574 dev_info(&pdev->dev, "found MOXA %s board (BusNo=%d, DevNo=%d)\n", in mxser_probe()
2575 mxser_cards[ent->driver_data].name, in mxser_probe()
2576 pdev->bus->number, PCI_SLOT(pdev->devfn)); in mxser_probe()
2580 dev_err(&pdev->dev, "PCI enable failed\n"); in mxser_probe()
2590 brd->info = &mxser_cards[ent->driver_data]; in mxser_probe()
2591 for (i = 0; i < brd->info->nports; i++) in mxser_probe()
2592 brd->ports[i].ioaddr = ioaddress + 8 * i; in mxser_probe()
2599 brd->vector = ioaddress; in mxser_probe()
2602 brd->irq = pdev->irq; in mxser_probe()
2604 brd->chip_flag = CheckIsMoxaMust(brd->ports[0].ioaddr); in mxser_probe()
2605 brd->uart_type = PORT_16550A; in mxser_probe()
2606 brd->vector_mask = 0; in mxser_probe()
2608 for (i = 0; i < brd->info->nports; i++) { in mxser_probe()
2610 if (Gpci_uart_info[j].type == brd->chip_flag) { in mxser_probe()
2611 brd->ports[i].max_baud = in mxser_probe()
2614 /* exception....CP-102 */ in mxser_probe()
2615 if (brd->info->flags & MXSER_HIGHBAUD) in mxser_probe()
2616 brd->ports[i].max_baud = 921600; in mxser_probe()
2622 if (brd->chip_flag == MOXA_MUST_MU860_HWID) { in mxser_probe()
2623 for (i = 0; i < brd->info->nports; i++) { in mxser_probe()
2625 brd->ports[i].opmode_ioaddr = ioaddress + 4; in mxser_probe()
2627 brd->ports[i].opmode_ioaddr = ioaddress + 0x0c; in mxser_probe()
2633 for (i = 0; i < brd->info->nports; i++) { in mxser_probe()
2634 brd->vector_mask |= (1 << i); in mxser_probe()
2635 brd->ports[i].baud_base = 921600; in mxser_probe()
2643 for (i = 0; i < brd->info->nports; i++) { in mxser_probe()
2644 tty_dev = tty_port_register_device(&brd->ports[i].port, in mxser_probe()
2645 mxvar_sdriver, brd->idx + i, &pdev->dev); in mxser_probe()
2648 for (; i > 0; i--) in mxser_probe()
2650 brd->idx + i - 1); in mxser_probe()
2659 for (i = 0; i < brd->info->nports; i++) in mxser_probe()
2660 tty_port_destroy(&brd->ports[i].port); in mxser_probe()
2661 free_irq(brd->irq, brd); in mxser_probe()
2665 brd->info = NULL; in mxser_probe()
2672 return -ENODEV; in mxser_probe()
2686 brd->info = NULL; in mxser_remove()
2706 return -ENOMEM; in mxser_module_init()
2712 mxvar_sdriver->name = "ttyMI"; in mxser_module_init()
2713 mxvar_sdriver->major = ttymajor; in mxser_module_init()
2714 mxvar_sdriver->minor_start = 0; in mxser_module_init()
2715 mxvar_sdriver->type = TTY_DRIVER_TYPE_SERIAL; in mxser_module_init()
2716 mxvar_sdriver->subtype = SERIAL_TYPE_NORMAL; in mxser_module_init()
2717 mxvar_sdriver->init_termios = tty_std_termios; in mxser_module_init()
2718 mxvar_sdriver->init_termios.c_cflag = B9600|CS8|CREAD|HUPCL|CLOCAL; in mxser_module_init()
2719 mxvar_sdriver->flags = TTY_DRIVER_REAL_RAW|TTY_DRIVER_DYNAMIC_DEV; in mxser_module_init()
2737 brd->info = NULL; in mxser_module_init()
2742 brd->info->name, ioaddr[b]); in mxser_module_init()
2747 brd->info = NULL; in mxser_module_init()
2751 brd->idx = m * MXSER_PORTS_PER_BOARD; in mxser_module_init()
2752 for (i = 0; i < brd->info->nports; i++) { in mxser_module_init()
2753 tty_dev = tty_port_register_device(&brd->ports[i].port, in mxser_module_init()
2754 mxvar_sdriver, brd->idx + i, NULL); in mxser_module_init()
2756 for (; i > 0; i--) in mxser_module_init()
2758 brd->idx + i - 1); in mxser_module_init()
2759 for (i = 0; i < brd->info->nports; i++) in mxser_module_init()
2760 tty_port_destroy(&brd->ports[i].port); in mxser_module_init()
2761 free_irq(brd->irq, brd); in mxser_module_init()
2763 brd->info = NULL; in mxser_module_init()
2767 if (brd->info == NULL) in mxser_module_init()
2777 retval = -ENODEV; in mxser_module_init()