diff options
Diffstat (limited to 'drivers/char/mxser_new.c')
-rw-r--r-- | drivers/char/mxser_new.c | 143 |
1 files changed, 16 insertions, 127 deletions
diff --git a/drivers/char/mxser_new.c b/drivers/char/mxser_new.c index 285104d379cb..a3328bb147b9 100644 --- a/drivers/char/mxser_new.c +++ b/drivers/char/mxser_new.c | |||
@@ -346,8 +346,6 @@ static int CheckIsMoxaMust(int io) | |||
346 | return MOXA_OTHER_UART; | 346 | return MOXA_OTHER_UART; |
347 | } | 347 | } |
348 | 348 | ||
349 | /* above is modified by Victor Yu. 08-15-2002 */ | ||
350 | |||
351 | static void process_txrx_fifo(struct mxser_port *info) | 349 | static void process_txrx_fifo(struct mxser_port *info) |
352 | { | 350 | { |
353 | int i; | 351 | int i; |
@@ -581,12 +579,10 @@ static int mxser_change_speed(struct mxser_port *info, | |||
581 | fcr = 0; | 579 | fcr = 0; |
582 | } else { | 580 | } else { |
583 | fcr = UART_FCR_ENABLE_FIFO; | 581 | fcr = UART_FCR_ENABLE_FIFO; |
584 | /* following add by Victor Yu. 08-30-2002 */ | ||
585 | if (info->board->chip_flag) { | 582 | if (info->board->chip_flag) { |
586 | fcr |= MOXA_MUST_FCR_GDA_MODE_ENABLE; | 583 | fcr |= MOXA_MUST_FCR_GDA_MODE_ENABLE; |
587 | SET_MOXA_MUST_FIFO_VALUE(info); | 584 | SET_MOXA_MUST_FIFO_VALUE(info); |
588 | } else { | 585 | } else { |
589 | /* above add by Victor Yu. 08-30-2002 */ | ||
590 | switch (info->rx_trigger) { | 586 | switch (info->rx_trigger) { |
591 | case 1: | 587 | case 1: |
592 | fcr |= UART_FCR_TRIGGER_1; | 588 | fcr |= UART_FCR_TRIGGER_1; |
@@ -612,19 +608,8 @@ static int mxser_change_speed(struct mxser_port *info, | |||
612 | info->IER |= UART_IER_MSI; | 608 | info->IER |= UART_IER_MSI; |
613 | if ((info->type == PORT_16550A) || (info->board->chip_flag)) { | 609 | if ((info->type == PORT_16550A) || (info->board->chip_flag)) { |
614 | info->MCR |= UART_MCR_AFE; | 610 | info->MCR |= UART_MCR_AFE; |
615 | /* status = mxser_get_msr(info->ioaddr, 0, info->port); */ | ||
616 | /* | ||
617 | save_flags(flags); | ||
618 | cli(); | ||
619 | status = inb(baseaddr + UART_MSR); | ||
620 | restore_flags(flags); | ||
621 | */ | ||
622 | /* mxser_check_modem_status(info, status); */ | ||
623 | } else { | 611 | } else { |
624 | /* status = mxser_get_msr(info->ioaddr, 0, info->port); */ | ||
625 | /* MX_LOCK(&info->slock); */ | ||
626 | status = inb(info->ioaddr + UART_MSR); | 612 | status = inb(info->ioaddr + UART_MSR); |
627 | /* MX_UNLOCK(&info->slock); */ | ||
628 | if (info->tty->hw_stopped) { | 613 | if (info->tty->hw_stopped) { |
629 | if (status & UART_MSR_CTS) { | 614 | if (status & UART_MSR_CTS) { |
630 | info->tty->hw_stopped = 0; | 615 | info->tty->hw_stopped = 0; |
@@ -692,7 +677,6 @@ static int mxser_change_speed(struct mxser_port *info, | |||
692 | UART_LSR_FE; | 677 | UART_LSR_FE; |
693 | } | 678 | } |
694 | } | 679 | } |
695 | /* following add by Victor Yu. 09-02-2002 */ | ||
696 | if (info->board->chip_flag) { | 680 | if (info->board->chip_flag) { |
697 | spin_lock_irqsave(&info->slock, flags); | 681 | spin_lock_irqsave(&info->slock, flags); |
698 | SET_MOXA_MUST_XON1_VALUE(info->ioaddr, START_CHAR(info->tty)); | 682 | SET_MOXA_MUST_XON1_VALUE(info->ioaddr, START_CHAR(info->tty)); |
@@ -707,18 +691,8 @@ static int mxser_change_speed(struct mxser_port *info, | |||
707 | } else { | 691 | } else { |
708 | DISABLE_MOXA_MUST_TX_SOFTWARE_FLOW_CONTROL(info->ioaddr); | 692 | DISABLE_MOXA_MUST_TX_SOFTWARE_FLOW_CONTROL(info->ioaddr); |
709 | } | 693 | } |
710 | /* | ||
711 | if ( I_IXANY(info->tty) ) { | ||
712 | info->MCR |= MOXA_MUST_MCR_XON_ANY; | ||
713 | ENABLE_MOXA_MUST_XON_ANY_FLOW_CONTROL(info->ioaddr); | ||
714 | } else { | ||
715 | info->MCR &= ~MOXA_MUST_MCR_XON_ANY; | ||
716 | DISABLE_MOXA_MUST_XON_ANY_FLOW_CONTROL(info->ioaddr); | ||
717 | } | ||
718 | */ | ||
719 | spin_unlock_irqrestore(&info->slock, flags); | 694 | spin_unlock_irqrestore(&info->slock, flags); |
720 | } | 695 | } |
721 | /* above add by Victor Yu. 09-02-2002 */ | ||
722 | 696 | ||
723 | 697 | ||
724 | outb(fcr, info->ioaddr + UART_FCR); /* set fcr */ | 698 | outb(fcr, info->ioaddr + UART_FCR); /* set fcr */ |
@@ -852,12 +826,9 @@ static int mxser_startup(struct mxser_port *info) | |||
852 | * Finally, enable interrupts | 826 | * Finally, enable interrupts |
853 | */ | 827 | */ |
854 | info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; | 828 | info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; |
855 | /* info->IER = UART_IER_RLSI | UART_IER_RDI; */ | ||
856 | 829 | ||
857 | /* following add by Victor Yu. 08-30-2002 */ | ||
858 | if (info->board->chip_flag) | 830 | if (info->board->chip_flag) |
859 | info->IER |= MOXA_MUST_IER_EGDAI; | 831 | info->IER |= MOXA_MUST_IER_EGDAI; |
860 | /* above add by Victor Yu. 08-30-2002 */ | ||
861 | outb(info->IER, info->ioaddr + UART_IER); /* enable interrupts */ | 832 | outb(info->IER, info->ioaddr + UART_IER); /* enable interrupts */ |
862 | 833 | ||
863 | /* | 834 | /* |
@@ -917,13 +888,11 @@ static void mxser_shutdown(struct mxser_port *info) | |||
917 | outb(info->MCR, info->ioaddr + UART_MCR); | 888 | outb(info->MCR, info->ioaddr + UART_MCR); |
918 | 889 | ||
919 | /* clear Rx/Tx FIFO's */ | 890 | /* clear Rx/Tx FIFO's */ |
920 | /* following add by Victor Yu. 08-30-2002 */ | ||
921 | if (info->board->chip_flag) | 891 | if (info->board->chip_flag) |
922 | outb(UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT | | 892 | outb(UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT | |
923 | MOXA_MUST_FCR_GDA_MODE_ENABLE, | 893 | MOXA_MUST_FCR_GDA_MODE_ENABLE, |
924 | info->ioaddr + UART_FCR); | 894 | info->ioaddr + UART_FCR); |
925 | else | 895 | else |
926 | /* above add by Victor Yu. 08-30-2002 */ | ||
927 | outb(UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, | 896 | outb(UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, |
928 | info->ioaddr + UART_FCR); | 897 | info->ioaddr + UART_FCR); |
929 | 898 | ||
@@ -935,10 +904,8 @@ static void mxser_shutdown(struct mxser_port *info) | |||
935 | 904 | ||
936 | info->flags &= ~ASYNC_INITIALIZED; | 905 | info->flags &= ~ASYNC_INITIALIZED; |
937 | 906 | ||
938 | /* following add by Victor Yu. 09-23-2002 */ | ||
939 | if (info->board->chip_flag) | 907 | if (info->board->chip_flag) |
940 | SET_MOXA_MUST_NO_SOFTWARE_FLOW_CONTROL(info->ioaddr); | 908 | SET_MOXA_MUST_NO_SOFTWARE_FLOW_CONTROL(info->ioaddr); |
941 | /* above add by Victor Yu. 09-23-2002 */ | ||
942 | 909 | ||
943 | spin_unlock_irqrestore(&info->slock, flags); | 910 | spin_unlock_irqrestore(&info->slock, flags); |
944 | } | 911 | } |
@@ -991,12 +958,7 @@ static int mxser_open(struct tty_struct *tty, struct file *filp) | |||
991 | info->session = process_session(current); | 958 | info->session = process_session(current); |
992 | info->pgrp = process_group(current); | 959 | info->pgrp = process_group(current); |
993 | 960 | ||
994 | /* | 961 | /* unmark here for very high baud rate (ex. 921600 bps) used */ |
995 | status = mxser_get_msr(info->base, 0, info->port); | ||
996 | mxser_check_modem_status(info, status); | ||
997 | */ | ||
998 | |||
999 | /* unmark here for very high baud rate (ex. 921600 bps) used */ | ||
1000 | tty->low_latency = 1; | 962 | tty->low_latency = 1; |
1001 | return 0; | 963 | return 0; |
1002 | } | 964 | } |
@@ -1070,9 +1032,7 @@ static void mxser_close(struct tty_struct *tty, struct file *filp) | |||
1070 | info->IER &= ~UART_IER_RLSI; | 1032 | info->IER &= ~UART_IER_RLSI; |
1071 | if (info->board->chip_flag) | 1033 | if (info->board->chip_flag) |
1072 | info->IER &= ~MOXA_MUST_RECV_ISR; | 1034 | info->IER &= ~MOXA_MUST_RECV_ISR; |
1073 | /* by William | 1035 | |
1074 | info->read_status_mask &= ~UART_LSR_DR; | ||
1075 | */ | ||
1076 | if (info->flags & ASYNC_INITIALIZED) { | 1036 | if (info->flags & ASYNC_INITIALIZED) { |
1077 | outb(info->IER, info->ioaddr + UART_IER); | 1037 | outb(info->IER, info->ioaddr + UART_IER); |
1078 | /* | 1038 | /* |
@@ -1135,8 +1095,7 @@ static int mxser_write(struct tty_struct *tty, const unsigned char *buf, int cou | |||
1135 | total += c; | 1095 | total += c; |
1136 | } | 1096 | } |
1137 | 1097 | ||
1138 | if (info->xmit_cnt && !tty->stopped | 1098 | if (info->xmit_cnt && !tty->stopped) { |
1139 | /*&& !(info->IER & UART_IER_THRI)*/) { | ||
1140 | if (!tty->hw_stopped || | 1099 | if (!tty->hw_stopped || |
1141 | (info->type == PORT_16550A) || | 1100 | (info->type == PORT_16550A) || |
1142 | (info->board->chip_flag)) { | 1101 | (info->board->chip_flag)) { |
@@ -1167,7 +1126,7 @@ static void mxser_put_char(struct tty_struct *tty, unsigned char ch) | |||
1167 | info->xmit_head &= SERIAL_XMIT_SIZE - 1; | 1126 | info->xmit_head &= SERIAL_XMIT_SIZE - 1; |
1168 | info->xmit_cnt++; | 1127 | info->xmit_cnt++; |
1169 | spin_unlock_irqrestore(&info->slock, flags); | 1128 | spin_unlock_irqrestore(&info->slock, flags); |
1170 | if (!tty->stopped /*&& !(info->IER & UART_IER_THRI)*/) { | 1129 | if (!tty->stopped) { |
1171 | if (!tty->hw_stopped || | 1130 | if (!tty->hw_stopped || |
1172 | (info->type == PORT_16550A) || | 1131 | (info->type == PORT_16550A) || |
1173 | info->board->chip_flag) { | 1132 | info->board->chip_flag) { |
@@ -1231,14 +1190,12 @@ static void mxser_flush_buffer(struct tty_struct *tty) | |||
1231 | spin_lock_irqsave(&info->slock, flags); | 1190 | spin_lock_irqsave(&info->slock, flags); |
1232 | info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; | 1191 | info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; |
1233 | 1192 | ||
1234 | /* below added by shinhay */ | ||
1235 | fcr = inb(info->ioaddr + UART_FCR); | 1193 | fcr = inb(info->ioaddr + UART_FCR); |
1236 | outb((fcr | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT), | 1194 | outb((fcr | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT), |
1237 | info->ioaddr + UART_FCR); | 1195 | info->ioaddr + UART_FCR); |
1238 | outb(fcr, info->ioaddr + UART_FCR); | 1196 | outb(fcr, info->ioaddr + UART_FCR); |
1239 | 1197 | ||
1240 | spin_unlock_irqrestore(&info->slock, flags); | 1198 | spin_unlock_irqrestore(&info->slock, flags); |
1241 | /* above added by shinhay */ | ||
1242 | 1199 | ||
1243 | tty_wakeup(tty); | 1200 | tty_wakeup(tty); |
1244 | } | 1201 | } |
@@ -1309,10 +1266,9 @@ static int mxser_set_serial_info(struct mxser_port *info, | |||
1309 | info->closing_wait = new_serial.closing_wait * HZ / 100; | 1266 | info->closing_wait = new_serial.closing_wait * HZ / 100; |
1310 | info->tty->low_latency = | 1267 | info->tty->low_latency = |
1311 | (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; | 1268 | (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; |
1312 | info->tty->low_latency = 0; /* (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; */ | 1269 | info->tty->low_latency = 0; |
1313 | } | 1270 | } |
1314 | 1271 | ||
1315 | /* added by casper, 3/17/2000, for mouse */ | ||
1316 | info->type = new_serial.type; | 1272 | info->type = new_serial.type; |
1317 | 1273 | ||
1318 | process_txrx_fifo(info); | 1274 | process_txrx_fifo(info); |
@@ -1430,7 +1386,6 @@ static int mxser_tiocmset(struct tty_struct *tty, struct file *file, | |||
1430 | static int mxser_program_mode(int port) | 1386 | static int mxser_program_mode(int port) |
1431 | { | 1387 | { |
1432 | int id, i, j, n; | 1388 | int id, i, j, n; |
1433 | /* unsigned long flags; */ | ||
1434 | 1389 | ||
1435 | spin_lock(&gm_lock); | 1390 | spin_lock(&gm_lock); |
1436 | outb(0, port); | 1391 | outb(0, port); |
@@ -1440,7 +1395,6 @@ static int mxser_program_mode(int port) | |||
1440 | (void)inb(port); | 1395 | (void)inb(port); |
1441 | outb(0, port); | 1396 | outb(0, port); |
1442 | (void)inb(port); | 1397 | (void)inb(port); |
1443 | /* restore_flags(flags); */ | ||
1444 | spin_unlock(&gm_lock); | 1398 | spin_unlock(&gm_lock); |
1445 | 1399 | ||
1446 | id = inb(port + 1) & 0x1F; | 1400 | id = inb(port + 1) & 0x1F; |
@@ -1623,7 +1577,6 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) | |||
1623 | continue; | 1577 | continue; |
1624 | 1578 | ||
1625 | status = mxser_get_msr(port->ioaddr, 0, i); | 1579 | status = mxser_get_msr(port->ioaddr, 0, i); |
1626 | /* mxser_check_modem_status(port, status); */ | ||
1627 | 1580 | ||
1628 | if (status & UART_MSR_TERI) | 1581 | if (status & UART_MSR_TERI) |
1629 | port->icount.rng++; | 1582 | port->icount.rng++; |
@@ -1707,7 +1660,6 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, | |||
1707 | if (tty->index == MXSER_PORTS) | 1660 | if (tty->index == MXSER_PORTS) |
1708 | return mxser_ioctl_special(cmd, argp); | 1661 | return mxser_ioctl_special(cmd, argp); |
1709 | 1662 | ||
1710 | /* following add by Victor Yu. 01-05-2004 */ | ||
1711 | if (cmd == MOXA_SET_OP_MODE || cmd == MOXA_GET_OP_MODE) { | 1663 | if (cmd == MOXA_SET_OP_MODE || cmd == MOXA_GET_OP_MODE) { |
1712 | int p; | 1664 | int p; |
1713 | unsigned long opmode; | 1665 | unsigned long opmode; |
@@ -1739,7 +1691,6 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, | |||
1739 | } | 1691 | } |
1740 | return 0; | 1692 | return 0; |
1741 | } | 1693 | } |
1742 | /* above add by Victor Yu. 01-05-2004 */ | ||
1743 | 1694 | ||
1744 | if (cmd != TIOCGSERIAL && cmd != TIOCMIWAIT && cmd != TIOCGICOUNT && | 1695 | if (cmd != TIOCGSERIAL && cmd != TIOCMIWAIT && cmd != TIOCGICOUNT && |
1745 | test_bit(TTY_IO_ERROR, &tty->flags)) | 1696 | test_bit(TTY_IO_ERROR, &tty->flags)) |
@@ -1829,7 +1780,6 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, | |||
1829 | cnow = info->icount; | 1780 | cnow = info->icount; |
1830 | spin_unlock_irqrestore(&info->slock, flags); | 1781 | spin_unlock_irqrestore(&info->slock, flags); |
1831 | p_cuser = argp; | 1782 | p_cuser = argp; |
1832 | /* modified by casper 1/11/2000 */ | ||
1833 | if (put_user(cnow.frame, &p_cuser->frame)) | 1783 | if (put_user(cnow.frame, &p_cuser->frame)) |
1834 | return -EFAULT; | 1784 | return -EFAULT; |
1835 | if (put_user(cnow.brk, &p_cuser->brk)) | 1785 | if (put_user(cnow.brk, &p_cuser->brk)) |
@@ -1855,7 +1805,6 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, | |||
1855 | info->mon_data.rxcnt = 0; | 1805 | info->mon_data.rxcnt = 0; |
1856 | info->mon_data.txcnt = 0; | 1806 | info->mon_data.txcnt = 0; |
1857 | return 0; | 1807 | return 0; |
1858 | /* (above) added by James. */ | ||
1859 | case MOXA_ASPP_SETBAUD:{ | 1808 | case MOXA_ASPP_SETBAUD:{ |
1860 | long baud; | 1809 | long baud; |
1861 | if (get_user(baud, (long __user *)argp)) | 1810 | if (get_user(baud, (long __user *)argp)) |
@@ -1886,8 +1835,6 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, | |||
1886 | case MOXA_ASPP_MON: { | 1835 | case MOXA_ASPP_MON: { |
1887 | int mcr, status; | 1836 | int mcr, status; |
1888 | 1837 | ||
1889 | /* info->mon_data.ser_param = tty->termios->c_cflag; */ | ||
1890 | |||
1891 | status = mxser_get_msr(info->ioaddr, 1, tty->index); | 1838 | status = mxser_get_msr(info->ioaddr, 1, tty->index); |
1892 | mxser_check_modem_status(info, status); | 1839 | mxser_check_modem_status(info, status); |
1893 | 1840 | ||
@@ -1944,7 +1891,6 @@ static void mxser_stoprx(struct tty_struct *tty) | |||
1944 | 1891 | ||
1945 | info->ldisc_stop_rx = 1; | 1892 | info->ldisc_stop_rx = 1; |
1946 | if (I_IXOFF(tty)) { | 1893 | if (I_IXOFF(tty)) { |
1947 | /* following add by Victor Yu. 09-02-2002 */ | ||
1948 | if (info->board->chip_flag) { | 1894 | if (info->board->chip_flag) { |
1949 | info->IER &= ~MOXA_MUST_RECV_ISR; | 1895 | info->IER &= ~MOXA_MUST_RECV_ISR; |
1950 | outb(info->IER, info->ioaddr + UART_IER); | 1896 | outb(info->IER, info->ioaddr + UART_IER); |
@@ -1981,7 +1927,6 @@ static void mxser_unthrottle(struct tty_struct *tty) | |||
1981 | if (info->x_char) | 1927 | if (info->x_char) |
1982 | info->x_char = 0; | 1928 | info->x_char = 0; |
1983 | else { | 1929 | else { |
1984 | /* following add by Victor Yu. 09-02-2002 */ | ||
1985 | if (info->board->chip_flag) { | 1930 | if (info->board->chip_flag) { |
1986 | info->IER |= MOXA_MUST_RECV_ISR; | 1931 | info->IER |= MOXA_MUST_RECV_ISR; |
1987 | outb(info->IER, info->ioaddr + UART_IER); | 1932 | outb(info->IER, info->ioaddr + UART_IER); |
@@ -2025,8 +1970,7 @@ static void mxser_start(struct tty_struct *tty) | |||
2025 | unsigned long flags; | 1970 | unsigned long flags; |
2026 | 1971 | ||
2027 | spin_lock_irqsave(&info->slock, flags); | 1972 | spin_lock_irqsave(&info->slock, flags); |
2028 | if (info->xmit_cnt && info->xmit_buf | 1973 | if (info->xmit_cnt && info->xmit_buf) { |
2029 | /* && !(info->IER & UART_IER_THRI) */) { | ||
2030 | outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER); | 1974 | outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER); |
2031 | info->IER |= UART_IER_THRI; | 1975 | info->IER |= UART_IER_THRI; |
2032 | outb(info->IER, info->ioaddr + UART_IER); | 1976 | outb(info->IER, info->ioaddr + UART_IER); |
@@ -2051,18 +1995,16 @@ static void mxser_set_termios(struct tty_struct *tty, struct termios *old_termio | |||
2051 | } | 1995 | } |
2052 | } | 1996 | } |
2053 | 1997 | ||
2054 | /* Handle sw stopped */ | 1998 | /* Handle sw stopped */ |
2055 | if ((old_termios->c_iflag & IXON) && | 1999 | if ((old_termios->c_iflag & IXON) && |
2056 | !(tty->termios->c_iflag & IXON)) { | 2000 | !(tty->termios->c_iflag & IXON)) { |
2057 | tty->stopped = 0; | 2001 | tty->stopped = 0; |
2058 | 2002 | ||
2059 | /* following add by Victor Yu. 09-02-2002 */ | ||
2060 | if (info->board->chip_flag) { | 2003 | if (info->board->chip_flag) { |
2061 | spin_lock_irqsave(&info->slock, flags); | 2004 | spin_lock_irqsave(&info->slock, flags); |
2062 | DISABLE_MOXA_MUST_RX_SOFTWARE_FLOW_CONTROL(info->ioaddr); | 2005 | DISABLE_MOXA_MUST_RX_SOFTWARE_FLOW_CONTROL(info->ioaddr); |
2063 | spin_unlock_irqrestore(&info->slock, flags); | 2006 | spin_unlock_irqrestore(&info->slock, flags); |
2064 | } | 2007 | } |
2065 | /* above add by Victor Yu. 09-02-2002 */ | ||
2066 | 2008 | ||
2067 | mxser_start(tty); | 2009 | mxser_start(tty); |
2068 | } | 2010 | } |
@@ -2131,7 +2073,6 @@ static void mxser_wait_until_sent(struct tty_struct *tty, int timeout) | |||
2131 | #endif | 2073 | #endif |
2132 | } | 2074 | } |
2133 | 2075 | ||
2134 | |||
2135 | /* | 2076 | /* |
2136 | * This routine is called by tty_hangup() when a hangup is signaled. | 2077 | * This routine is called by tty_hangup() when a hangup is signaled. |
2137 | */ | 2078 | */ |
@@ -2148,8 +2089,6 @@ void mxser_hangup(struct tty_struct *tty) | |||
2148 | wake_up_interruptible(&info->open_wait); | 2089 | wake_up_interruptible(&info->open_wait); |
2149 | } | 2090 | } |
2150 | 2091 | ||
2151 | |||
2152 | /* added by James 03-12-2004. */ | ||
2153 | /* | 2092 | /* |
2154 | * mxser_rs_break() --- routine which turns the break handling on or off | 2093 | * mxser_rs_break() --- routine which turns the break handling on or off |
2155 | */ | 2094 | */ |
@@ -2168,8 +2107,6 @@ static void mxser_rs_break(struct tty_struct *tty, int break_state) | |||
2168 | spin_unlock_irqrestore(&info->slock, flags); | 2107 | spin_unlock_irqrestore(&info->slock, flags); |
2169 | } | 2108 | } |
2170 | 2109 | ||
2171 | /* (above) added by James. */ | ||
2172 | |||
2173 | static void mxser_receive_chars(struct mxser_port *port, int *status) | 2110 | static void mxser_receive_chars(struct mxser_port *port, int *status) |
2174 | { | 2111 | { |
2175 | struct tty_struct *tty = port->tty; | 2112 | struct tty_struct *tty = port->tty; |
@@ -2183,36 +2120,26 @@ static void mxser_receive_chars(struct mxser_port *port, int *status) | |||
2183 | spin_lock_irqsave(&port->slock, flags); | 2120 | spin_lock_irqsave(&port->slock, flags); |
2184 | 2121 | ||
2185 | recv_room = tty->receive_room; | 2122 | recv_room = tty->receive_room; |
2186 | if ((recv_room == 0) && (!port->ldisc_stop_rx)) { | 2123 | if ((recv_room == 0) && (!port->ldisc_stop_rx)) |
2187 | /* mxser_throttle(tty); */ | ||
2188 | mxser_stoprx(tty); | 2124 | mxser_stoprx(tty); |
2189 | /* return; */ | ||
2190 | } | ||
2191 | 2125 | ||
2192 | /* following add by Victor Yu. 09-02-2002 */ | ||
2193 | if (port->board->chip_flag != MOXA_OTHER_UART) { | 2126 | if (port->board->chip_flag != MOXA_OTHER_UART) { |
2194 | 2127 | ||
2195 | if (*status & UART_LSR_SPECIAL) | 2128 | if (*status & UART_LSR_SPECIAL) |
2196 | goto intr_old; | 2129 | goto intr_old; |
2197 | /* following add by Victor Yu. 02-11-2004 */ | ||
2198 | if (port->board->chip_flag == MOXA_MUST_MU860_HWID && | 2130 | if (port->board->chip_flag == MOXA_MUST_MU860_HWID && |
2199 | (*status & MOXA_MUST_LSR_RERR)) | 2131 | (*status & MOXA_MUST_LSR_RERR)) |
2200 | goto intr_old; | 2132 | goto intr_old; |
2201 | /* above add by Victor Yu. 02-14-2004 */ | ||
2202 | if (*status & MOXA_MUST_LSR_RERR) | 2133 | if (*status & MOXA_MUST_LSR_RERR) |
2203 | goto intr_old; | 2134 | goto intr_old; |
2204 | 2135 | ||
2205 | gdl = inb(port->ioaddr + MOXA_MUST_GDL_REGISTER); | 2136 | gdl = inb(port->ioaddr + MOXA_MUST_GDL_REGISTER); |
2206 | 2137 | ||
2207 | /* add by Victor Yu. 02-11-2004 */ | ||
2208 | if (port->board->chip_flag == MOXA_MUST_MU150_HWID) | 2138 | if (port->board->chip_flag == MOXA_MUST_MU150_HWID) |
2209 | gdl &= MOXA_MUST_GDL_MASK; | 2139 | gdl &= MOXA_MUST_GDL_MASK; |
2210 | if (gdl >= recv_room) { | 2140 | if (gdl >= recv_room) { |
2211 | if (!port->ldisc_stop_rx) { | 2141 | if (!port->ldisc_stop_rx) |
2212 | /* mxser_throttle(tty); */ | ||
2213 | mxser_stoprx(tty); | 2142 | mxser_stoprx(tty); |
2214 | } | ||
2215 | /* return; */ | ||
2216 | } | 2143 | } |
2217 | while (gdl--) { | 2144 | while (gdl--) { |
2218 | ch = inb(port->ioaddr + UART_RX); | 2145 | ch = inb(port->ioaddr + UART_RX); |
@@ -2221,20 +2148,16 @@ static void mxser_receive_chars(struct mxser_port *port, int *status) | |||
2221 | } | 2148 | } |
2222 | goto end_intr; | 2149 | goto end_intr; |
2223 | } | 2150 | } |
2224 | intr_old: | 2151 | intr_old: |
2225 | /* above add by Victor Yu. 09-02-2002 */ | ||
2226 | 2152 | ||
2227 | do { | 2153 | do { |
2228 | if (max-- < 0) | 2154 | if (max-- < 0) |
2229 | break; | 2155 | break; |
2230 | 2156 | ||
2231 | ch = inb(port->ioaddr + UART_RX); | 2157 | ch = inb(port->ioaddr + UART_RX); |
2232 | /* following add by Victor Yu. 09-02-2002 */ | 2158 | if (port->board->chip_flag && (*status & UART_LSR_OE)) |
2233 | if (port->board->chip_flag && (*status & UART_LSR_OE) | ||
2234 | /*&& !(*status&UART_LSR_DR) */) | ||
2235 | outb(0x23, port->ioaddr + UART_FCR); | 2159 | outb(0x23, port->ioaddr + UART_FCR); |
2236 | *status &= port->read_status_mask; | 2160 | *status &= port->read_status_mask; |
2237 | /* above add by Victor Yu. 09-02-2002 */ | ||
2238 | if (*status & port->ignore_status_mask) { | 2161 | if (*status & port->ignore_status_mask) { |
2239 | if (++ignored > 100) | 2162 | if (++ignored > 100) |
2240 | break; | 2163 | break; |
@@ -2243,50 +2166,38 @@ static void mxser_receive_chars(struct mxser_port *port, int *status) | |||
2243 | if (*status & UART_LSR_SPECIAL) { | 2166 | if (*status & UART_LSR_SPECIAL) { |
2244 | if (*status & UART_LSR_BI) { | 2167 | if (*status & UART_LSR_BI) { |
2245 | flag = TTY_BREAK; | 2168 | flag = TTY_BREAK; |
2246 | /* added by casper 1/11/2000 */ | ||
2247 | port->icount.brk++; | 2169 | port->icount.brk++; |
2248 | 2170 | ||
2249 | if (port->flags & ASYNC_SAK) | 2171 | if (port->flags & ASYNC_SAK) |
2250 | do_SAK(tty); | 2172 | do_SAK(tty); |
2251 | } else if (*status & UART_LSR_PE) { | 2173 | } else if (*status & UART_LSR_PE) { |
2252 | flag = TTY_PARITY; | 2174 | flag = TTY_PARITY; |
2253 | /* added by casper 1/11/2000 */ | ||
2254 | port->icount.parity++; | 2175 | port->icount.parity++; |
2255 | } else if (*status & UART_LSR_FE) { | 2176 | } else if (*status & UART_LSR_FE) { |
2256 | flag = TTY_FRAME; | 2177 | flag = TTY_FRAME; |
2257 | /* added by casper 1/11/2000 */ | ||
2258 | port->icount.frame++; | 2178 | port->icount.frame++; |
2259 | } else if (*status & UART_LSR_OE) { | 2179 | } else if (*status & UART_LSR_OE) { |
2260 | flag = TTY_OVERRUN; | 2180 | flag = TTY_OVERRUN; |
2261 | /* added by casper 1/11/2000 */ | ||
2262 | port->icount.overrun++; | 2181 | port->icount.overrun++; |
2263 | } | 2182 | } |
2264 | } | 2183 | } |
2265 | tty_insert_flip_char(tty, ch, flag); | 2184 | tty_insert_flip_char(tty, ch, flag); |
2266 | cnt++; | 2185 | cnt++; |
2267 | if (cnt >= recv_room) { | 2186 | if (cnt >= recv_room) { |
2268 | if (!port->ldisc_stop_rx) { | 2187 | if (!port->ldisc_stop_rx) |
2269 | /* mxser_throttle(tty); */ | ||
2270 | mxser_stoprx(tty); | 2188 | mxser_stoprx(tty); |
2271 | } | ||
2272 | break; | 2189 | break; |
2273 | } | 2190 | } |
2274 | 2191 | ||
2275 | } | 2192 | } |
2276 | 2193 | ||
2277 | /* following add by Victor Yu. 09-02-2002 */ | ||
2278 | if (port->board->chip_flag) | 2194 | if (port->board->chip_flag) |
2279 | break; | 2195 | break; |
2280 | 2196 | ||
2281 | /* mask by Victor Yu. 09-02-2002 | ||
2282 | *status = inb(port->ioaddr + UART_LSR) & port->read_status_mask; | ||
2283 | */ | ||
2284 | /* following add by Victor Yu. 09-02-2002 */ | ||
2285 | *status = inb(port->ioaddr + UART_LSR); | 2197 | *status = inb(port->ioaddr + UART_LSR); |
2286 | /* above add by Victor Yu. 09-02-2002 */ | ||
2287 | } while (*status & UART_LSR_DR); | 2198 | } while (*status & UART_LSR_DR); |
2288 | 2199 | ||
2289 | end_intr: /* add by Victor Yu. 09-02-2002 */ | 2200 | end_intr: |
2290 | mxvar_log.rxcnt[port->tty->index] += cnt; | 2201 | mxvar_log.rxcnt[port->tty->index] += cnt; |
2291 | port->mon_data.rxcnt += cnt; | 2202 | port->mon_data.rxcnt += cnt; |
2292 | port->mon_data.up_rxcnt += cnt; | 2203 | port->mon_data.up_rxcnt += cnt; |
@@ -2308,8 +2219,6 @@ static void mxser_transmit_chars(struct mxser_port *port) | |||
2308 | mxvar_log.txcnt[port->tty->index]++; | 2219 | mxvar_log.txcnt[port->tty->index]++; |
2309 | port->mon_data.txcnt++; | 2220 | port->mon_data.txcnt++; |
2310 | port->mon_data.up_txcnt++; | 2221 | port->mon_data.up_txcnt++; |
2311 | |||
2312 | /* added by casper 1/11/2000 */ | ||
2313 | port->icount.tx++; | 2222 | port->icount.tx++; |
2314 | goto unlock; | 2223 | goto unlock; |
2315 | } | 2224 | } |
@@ -2337,11 +2246,8 @@ static void mxser_transmit_chars(struct mxser_port *port) | |||
2337 | } while (--count > 0); | 2246 | } while (--count > 0); |
2338 | mxvar_log.txcnt[port->tty->index] += (cnt - port->xmit_cnt); | 2247 | mxvar_log.txcnt[port->tty->index] += (cnt - port->xmit_cnt); |
2339 | 2248 | ||
2340 | /* added by James 03-12-2004. */ | ||
2341 | port->mon_data.txcnt += (cnt - port->xmit_cnt); | 2249 | port->mon_data.txcnt += (cnt - port->xmit_cnt); |
2342 | port->mon_data.up_txcnt += (cnt - port->xmit_cnt); | 2250 | port->mon_data.up_txcnt += (cnt - port->xmit_cnt); |
2343 | |||
2344 | /* added by casper 1/11/2000 */ | ||
2345 | port->icount.tx += (cnt - port->xmit_cnt); | 2251 | port->icount.tx += (cnt - port->xmit_cnt); |
2346 | 2252 | ||
2347 | if (port->xmit_cnt < WAKEUP_CHARS) { | 2253 | if (port->xmit_cnt < WAKEUP_CHARS) { |
@@ -2369,8 +2275,6 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
2369 | unsigned int int_cnt; | 2275 | unsigned int int_cnt; |
2370 | int handled = IRQ_NONE; | 2276 | int handled = IRQ_NONE; |
2371 | 2277 | ||
2372 | /* spin_lock(&gm_lock); */ | ||
2373 | |||
2374 | for (i = 0; i < MXSER_BOARDS; i++) | 2278 | for (i = 0; i < MXSER_BOARDS; i++) |
2375 | if (dev_id == &mxser_boards[i]) { | 2279 | if (dev_id == &mxser_boards[i]) { |
2376 | brd = dev_id; | 2280 | brd = dev_id; |
@@ -2397,7 +2301,6 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
2397 | 2301 | ||
2398 | int_cnt = 0; | 2302 | int_cnt = 0; |
2399 | do { | 2303 | do { |
2400 | /* following add by Victor Yu. 09-13-2002 */ | ||
2401 | iir = inb(port->ioaddr + UART_IIR); | 2304 | iir = inb(port->ioaddr + UART_IIR); |
2402 | if (iir & UART_IIR_NO_INT) | 2305 | if (iir & UART_IIR_NO_INT) |
2403 | break; | 2306 | break; |
@@ -2408,9 +2311,7 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
2408 | inb(port->ioaddr + UART_MSR); | 2311 | inb(port->ioaddr + UART_MSR); |
2409 | break; | 2312 | break; |
2410 | } | 2313 | } |
2411 | /* above add by Victor Yu. 09-13-2002 */ | ||
2412 | 2314 | ||
2413 | /* following add by Victor Yu. 09-02-2002 */ | ||
2414 | status = inb(port->ioaddr + UART_LSR); | 2315 | status = inb(port->ioaddr + UART_LSR); |
2415 | 2316 | ||
2416 | if (status & UART_LSR_PE) | 2317 | if (status & UART_LSR_PE) |
@@ -2424,12 +2325,6 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
2424 | port->err_shadow |= NPPI_NOTIFY_BREAK; | 2325 | port->err_shadow |= NPPI_NOTIFY_BREAK; |
2425 | 2326 | ||
2426 | if (port->board->chip_flag) { | 2327 | if (port->board->chip_flag) { |
2427 | /* | ||
2428 | if ( (status & 0x02) && !(status & 0x01) ) { | ||
2429 | outb(port->ioaddr+UART_FCR, 0x23); | ||
2430 | continue; | ||
2431 | } | ||
2432 | */ | ||
2433 | if (iir == MOXA_MUST_IIR_GDA || | 2328 | if (iir == MOXA_MUST_IIR_GDA || |
2434 | iir == MOXA_MUST_IIR_RDA || | 2329 | iir == MOXA_MUST_IIR_RDA || |
2435 | iir == MOXA_MUST_IIR_RTO || | 2330 | iir == MOXA_MUST_IIR_RTO || |
@@ -2438,8 +2333,6 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
2438 | &status); | 2333 | &status); |
2439 | 2334 | ||
2440 | } else { | 2335 | } else { |
2441 | /* above add by Victor Yu. 09-02-2002 */ | ||
2442 | |||
2443 | status &= port->read_status_mask; | 2336 | status &= port->read_status_mask; |
2444 | if (status & UART_LSR_DR) | 2337 | if (status & UART_LSR_DR) |
2445 | mxser_receive_chars(port, | 2338 | mxser_receive_chars(port, |
@@ -2449,14 +2342,11 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
2449 | if (msr & UART_MSR_ANY_DELTA) | 2342 | if (msr & UART_MSR_ANY_DELTA) |
2450 | mxser_check_modem_status(port, msr); | 2343 | mxser_check_modem_status(port, msr); |
2451 | 2344 | ||
2452 | /* following add by Victor Yu. 09-13-2002 */ | ||
2453 | if (port->board->chip_flag) { | 2345 | if (port->board->chip_flag) { |
2454 | if (iir == 0x02 && (status & | 2346 | if (iir == 0x02 && (status & |
2455 | UART_LSR_THRE)) | 2347 | UART_LSR_THRE)) |
2456 | mxser_transmit_chars(port); | 2348 | mxser_transmit_chars(port); |
2457 | } else { | 2349 | } else { |
2458 | /* above add by Victor Yu. 09-13-2002 */ | ||
2459 | |||
2460 | if (status & UART_LSR_THRE) | 2350 | if (status & UART_LSR_THRE) |
2461 | mxser_transmit_chars(port); | 2351 | mxser_transmit_chars(port); |
2462 | } | 2352 | } |
@@ -2466,8 +2356,7 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
2466 | break; /* Prevent infinite loops */ | 2356 | break; /* Prevent infinite loops */ |
2467 | } | 2357 | } |
2468 | 2358 | ||
2469 | irq_stop: | 2359 | irq_stop: |
2470 | /* spin_unlock(&gm_lock); */ | ||
2471 | return handled; | 2360 | return handled; |
2472 | } | 2361 | } |
2473 | 2362 | ||
@@ -2639,10 +2528,10 @@ static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd) | |||
2639 | for (i = 7, bits = 0x0100; i >= 0; i--, bits <<= 1) { | 2528 | for (i = 7, bits = 0x0100; i >= 0; i--, bits <<= 1) { |
2640 | if (regs[12] & bits) { | 2529 | if (regs[12] & bits) { |
2641 | brd->ports[i].baud_base = 921600; | 2530 | brd->ports[i].baud_base = 921600; |
2642 | brd->ports[i].max_baud = 921600; /* add by Victor Yu. 09-04-2002 */ | 2531 | brd->ports[i].max_baud = 921600; |
2643 | } else { | 2532 | } else { |
2644 | brd->ports[i].baud_base = 115200; | 2533 | brd->ports[i].baud_base = 115200; |
2645 | brd->ports[i].max_baud = 115200; /* add by Victor Yu. 09-04-2002 */ | 2534 | brd->ports[i].max_baud = 115200; |
2646 | } | 2535 | } |
2647 | } | 2536 | } |
2648 | scratch2 = inb(cap + UART_LCR) & (~UART_LCR_DLAB); | 2537 | scratch2 = inb(cap + UART_LCR) & (~UART_LCR_DLAB); |