sio.c (32089) | sio.c (32332) |
---|---|
1/*- 2 * Copyright (c) 1991 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * from: @(#)com.c 7.5 (Berkeley) 5/16/91 | 1/*- 2 * Copyright (c) 1991 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * from: @(#)com.c 7.5 (Berkeley) 5/16/91 |
34 * $Id: sio.c,v 1.45 1997/12/16 17:40:39 eivind Exp $ | 34 * $Id: sio.c,v 1.46 1997/12/29 16:08:48 kato Exp $ |
35 */ 36 37#include "opt_comconsole.h" 38#include "opt_compat.h" 39#include "opt_ddb.h" 40#include "opt_sio.h" 41#include "sio.h" 42#include "pnp.h" --- 173 unchanged lines hidden (view full) --- 216#define COM_CONSOLE(dev) ((dev)->id_flags & 0x10) 217#define COM_FORCECONSOLE(dev) ((dev)->id_flags & 0x20) 218#define COM_LLCONSOLE(dev) ((dev)->id_flags & 0x40) 219#define COM_LOSESOUTINTS(dev) ((dev)->id_flags & 0x08) 220#define COM_NOFIFO(dev) ((dev)->id_flags & 0x02) 221#define COM_VERBOSE(dev) ((dev)->id_flags & 0x80) 222#define COM_NOTST3(dev) ((dev)->id_flags & 0x10000) 223#define COM_ST16650A(dev) ((dev)->id_flags & 0x20000) | 35 */ 36 37#include "opt_comconsole.h" 38#include "opt_compat.h" 39#include "opt_ddb.h" 40#include "opt_sio.h" 41#include "sio.h" 42#include "pnp.h" --- 173 unchanged lines hidden (view full) --- 216#define COM_CONSOLE(dev) ((dev)->id_flags & 0x10) 217#define COM_FORCECONSOLE(dev) ((dev)->id_flags & 0x20) 218#define COM_LLCONSOLE(dev) ((dev)->id_flags & 0x40) 219#define COM_LOSESOUTINTS(dev) ((dev)->id_flags & 0x08) 220#define COM_NOFIFO(dev) ((dev)->id_flags & 0x02) 221#define COM_VERBOSE(dev) ((dev)->id_flags & 0x80) 222#define COM_NOTST3(dev) ((dev)->id_flags & 0x10000) 223#define COM_ST16650A(dev) ((dev)->id_flags & 0x20000) |
224#define COM_C_NOPROBE (0x40000) 225#define COM_NOPROBE(dev) ((dev)->id_flags & COM_C_NOPROBE) 226#define COM_C_IIR_TXRDYBUG (0x80000) 227#define COM_IIR_TXRDYBUG(dev) ((dev)->id_flags & COM_C_IIR_TXRDYBUG) |
|
224#define COM_FIFOSIZE(dev) (((dev)->id_flags & 0xff000000) >> 24) 225 226#ifndef PC98 227#define com_scr 7 /* scratch register for 16450-16550 (R/W) */ 228#endif /* !PC98 */ 229 230/* 231 * Input buffer watermarks. --- 54 unchanged lines hidden (view full) --- 286 u_char *l_head; /* next char to process */ 287 u_char *l_tail; /* one past the last char to process */ 288 struct lbq *l_next; /* next in queue */ 289 bool_t l_queued; /* nonzero if queued */ 290}; 291 292/* com device structure */ 293struct com_s { | 228#define COM_FIFOSIZE(dev) (((dev)->id_flags & 0xff000000) >> 24) 229 230#ifndef PC98 231#define com_scr 7 /* scratch register for 16450-16550 (R/W) */ 232#endif /* !PC98 */ 233 234/* 235 * Input buffer watermarks. --- 54 unchanged lines hidden (view full) --- 290 u_char *l_head; /* next char to process */ 291 u_char *l_tail; /* one past the last char to process */ 292 struct lbq *l_next; /* next in queue */ 293 bool_t l_queued; /* nonzero if queued */ 294}; 295 296/* com device structure */ 297struct com_s { |
298 u_int id_flags; /* Copy isa device falgas */ |
|
294 u_char state; /* miscellaneous flag bits */ 295 bool_t active_out; /* nonzero if the callout device is open */ 296 u_char cfcr_image; /* copy of value written to CFCR */ 297#ifdef COM_ESP 298 bool_t esp; /* is this unit a hayes esp board? */ 299#endif 300 u_char extra_state; /* more flag bits, separate for order trick */ 301 u_char fifo_image; /* copy of value written to FIFO */ --- 49 unchanged lines hidden (view full) --- 351#ifdef COM_ESP 352 Port_t esp_port; 353#endif 354 Port_t int_id_port; 355 Port_t iobase; 356 Port_t modem_ctl_port; 357 Port_t line_status_port; 358 Port_t modem_status_port; | 299 u_char state; /* miscellaneous flag bits */ 300 bool_t active_out; /* nonzero if the callout device is open */ 301 u_char cfcr_image; /* copy of value written to CFCR */ 302#ifdef COM_ESP 303 bool_t esp; /* is this unit a hayes esp board? */ 304#endif 305 u_char extra_state; /* more flag bits, separate for order trick */ 306 u_char fifo_image; /* copy of value written to FIFO */ --- 49 unchanged lines hidden (view full) --- 356#ifdef COM_ESP 357 Port_t esp_port; 358#endif 359 Port_t int_id_port; 360 Port_t iobase; 361 Port_t modem_ctl_port; 362 Port_t line_status_port; 363 Port_t modem_status_port; |
364 Port_t intr_ctl_port; /* Ports of IIR register */ |
|
359 360 struct tty *tp; /* cross reference */ 361 362 /* Initial state. */ 363 struct termios it_in; /* should be in struct tty */ 364 struct termios it_out; 365 366 /* Lock state. */ --- 364 unchanged lines hidden (view full) --- 731{ 732 733 /* validate unit number. */ 734 if (devi->isahd.id_unit >= (NSIOTOT)) 735 return(ENODEV); 736 /* Make sure it isn't already probed. */ 737 if (com_addr(devi->isahd.id_unit)) 738 return(EBUSY); | 365 366 struct tty *tp; /* cross reference */ 367 368 /* Initial state. */ 369 struct termios it_in; /* should be in struct tty */ 370 struct termios it_out; 371 372 /* Lock state. */ --- 364 unchanged lines hidden (view full) --- 737{ 738 739 /* validate unit number. */ 740 if (devi->isahd.id_unit >= (NSIOTOT)) 741 return(ENODEV); 742 /* Make sure it isn't already probed. */ 743 if (com_addr(devi->isahd.id_unit)) 744 return(EBUSY); |
745 746 /* It's already probed as serial by Upper */ 747 devi->isahd.id_flags |= COM_C_NOPROBE; 748 |
|
739 /* 740 * Probe the device. If a value is returned, the 741 * device was found at the location. 742 */ 743 if (sioprobe(&devi->isahd) == 0) 744 return(ENXIO); 745 if (sioattach(&devi->isahd) == 0) 746 return(ENXIO); --- 259 unchanged lines hidden (view full) --- 1006 * (MCR_IENABLE was hidden). This should leave the device driving 1007 * an interrupt line high. It doesn't matter if the interrupt 1008 * line oscillates while we are not looking at it, since interrupts 1009 * are disabled. 1010 */ 1011/* EXTRA DELAY? */ 1012 outb(iobase + com_mcr, mcr_image); 1013 | 749 /* 750 * Probe the device. If a value is returned, the 751 * device was found at the location. 752 */ 753 if (sioprobe(&devi->isahd) == 0) 754 return(ENXIO); 755 if (sioattach(&devi->isahd) == 0) 756 return(ENXIO); --- 259 unchanged lines hidden (view full) --- 1016 * (MCR_IENABLE was hidden). This should leave the device driving 1017 * an interrupt line high. It doesn't matter if the interrupt 1018 * line oscillates while we are not looking at it, since interrupts 1019 * are disabled. 1020 */ 1021/* EXTRA DELAY? */ 1022 outb(iobase + com_mcr, mcr_image); 1023 |
1024 /* 1025 * It's a definitly Serial PCMCIA(16550A), but still be required 1026 * for IIR_TXRDY implementation ( Palido 321s, DC-1S... ) 1027 */ 1028 if ( COM_NOPROBE(dev) ) { 1029 /* Reading IIR register twice */ 1030 for ( fn = 0; fn < 2; fn ++ ) { 1031 DELAY(10000); 1032 failures[6] = inb(iobase + com_iir); 1033 } 1034 /* Check IIR_TXRDY clear ? */ 1035 result = IO_COMSIZE; 1036 if ( failures[6] & IIR_TXRDY ) { 1037 /* Nop, Double check with clearing IER */ 1038 outb(iobase + com_ier, 0); 1039 if ( inb(iobase + com_iir) & IIR_NOPEND ) { 1040 /* Ok. we're familia this gang */ 1041 dev->id_flags |= COM_C_IIR_TXRDYBUG; /* Set IIR_TXRDYBUG */ 1042 } else { 1043 /* Unknow, Just omit this chip.. XXX*/ 1044 result = 0; 1045 } 1046 } else { 1047 /* OK. this is well-known guys */ 1048 dev->id_flags &= ~COM_C_IIR_TXRDYBUG; /*Clear IIR_TXRDYBUG*/ 1049 } 1050 outb(iobase + com_cfcr, CFCR_8BITS); 1051 enable_intr(); 1052 return( result ); 1053 } 1054 |
|
1014 /* 1015 * Check that 1016 * o the CFCR, IER and MCR in UART hold the values written to them 1017 * (the values happen to be all distinct - this is good for 1018 * avoiding false positive tests from bus echoes). 1019 * o an output interrupt is generated and its vector is correct. 1020 * o the interrupt goes away when the IIR in the UART is read. 1021 */ --- 158 unchanged lines hidden (view full) --- 1180 if((iobase & 0x0f0) == 0xd0) { 1181 com->pc98_if_type = MC16550; 1182 com->data_port = iobase + com_data; 1183 com->int_id_port = iobase + com_iir; 1184 com->modem_ctl_port = iobase + com_mcr; 1185 com->mcr_image = inb(com->modem_ctl_port); 1186 com->line_status_port = iobase + com_lsr; 1187 com->modem_status_port = iobase + com_msr; | 1055 /* 1056 * Check that 1057 * o the CFCR, IER and MCR in UART hold the values written to them 1058 * (the values happen to be all distinct - this is good for 1059 * avoiding false positive tests from bus echoes). 1060 * o an output interrupt is generated and its vector is correct. 1061 * o the interrupt goes away when the IIR in the UART is read. 1062 */ --- 158 unchanged lines hidden (view full) --- 1221 if((iobase & 0x0f0) == 0xd0) { 1222 com->pc98_if_type = MC16550; 1223 com->data_port = iobase + com_data; 1224 com->int_id_port = iobase + com_iir; 1225 com->modem_ctl_port = iobase + com_mcr; 1226 com->mcr_image = inb(com->modem_ctl_port); 1227 com->line_status_port = iobase + com_lsr; 1228 com->modem_status_port = iobase + com_msr; |
1229 com->intr_ctl_port = iobase + com_ier; |
|
1188 } 1189#else /* not PC98 */ 1190 com->data_port = iobase + com_data; 1191 com->int_id_port = iobase + com_iir; 1192 com->modem_ctl_port = iobase + com_mcr; 1193 com->mcr_image = inb(com->modem_ctl_port); 1194 com->line_status_port = iobase + com_lsr; 1195 com->modem_status_port = iobase + com_msr; | 1230 } 1231#else /* not PC98 */ 1232 com->data_port = iobase + com_data; 1233 com->int_id_port = iobase + com_iir; 1234 com->modem_ctl_port = iobase + com_mcr; 1235 com->mcr_image = inb(com->modem_ctl_port); 1236 com->line_status_port = iobase + com_lsr; 1237 com->modem_status_port = iobase + com_msr; |
1238 com->intr_ctl_port = iobase + com_ier; |
|
1196#endif 1197 1198 /* 1199 * We don't use all the flags from <sys/ttydefaults.h> since they 1200 * are only relevant for logins. It's important to have echo off 1201 * initially so that the line doesn't start blathering before the 1202 * echo flag can be turned off. 1203 */ --- 26 unchanged lines hidden (view full) --- 1230 if((inb(iobase+7) ^ inb(iobase+7)) & 0x80) { 1231 printf(" Digicom Systems, Inc. SoftModem"); 1232 goto determined_type; 1233 } 1234#endif /* DSI_SOFT_MODEM */ 1235 1236#ifndef PC98 1237#ifdef COM_MULTIPORT | 1239#endif 1240 1241 /* 1242 * We don't use all the flags from <sys/ttydefaults.h> since they 1243 * are only relevant for logins. It's important to have echo off 1244 * initially so that the line doesn't start blathering before the 1245 * echo flag can be turned off. 1246 */ --- 26 unchanged lines hidden (view full) --- 1273 if((inb(iobase+7) ^ inb(iobase+7)) & 0x80) { 1274 printf(" Digicom Systems, Inc. SoftModem"); 1275 goto determined_type; 1276 } 1277#endif /* DSI_SOFT_MODEM */ 1278 1279#ifndef PC98 1280#ifdef COM_MULTIPORT |
1238 if (!COM_ISMULTIPORT(isdp)) | 1281 if (!COM_ISMULTIPORT(isdp) && !COM_IIR_TXRDYBUG(isdp)) 1282#else 1283 if (!COM_IIR_TXRDYBUG(isdp)) |
1239#endif 1240 { 1241 u_char scr; 1242 u_char scr1; 1243 u_char scr2; 1244 1245 scr = inb(iobase + com_scr); 1246 outb(iobase + com_scr, 0xa5); --- 120 unchanged lines hidden (view full) --- 1367 COM_MPMASTER(isdp))->id_irq == 0; 1368 } 1369#endif /* COM_MULTIPORT */ 1370#ifdef PC98 1371 } 1372#endif 1373 if (unit == comconsole) 1374 printf(", console"); | 1284#endif 1285 { 1286 u_char scr; 1287 u_char scr1; 1288 u_char scr2; 1289 1290 scr = inb(iobase + com_scr); 1291 outb(iobase + com_scr, 0xa5); --- 120 unchanged lines hidden (view full) --- 1412 COM_MPMASTER(isdp))->id_irq == 0; 1413 } 1414#endif /* COM_MULTIPORT */ 1415#ifdef PC98 1416 } 1417#endif 1418 if (unit == comconsole) 1419 printf(", console"); |
1420 if ( COM_IIR_TXRDYBUG(isdp) ) 1421 printf(" with a bogus IIR_TXRDY register"); |
|
1375 printf("\n"); 1376 1377 s = spltty(); 1378 com_addr(unit) = com; 1379 splx(s); 1380 1381 dev = makedev(CDEV_MAJOR, 0); 1382 cdevsw_add(&dev, &sio_cdevsw, NULL); --- 12 unchanged lines hidden (view full) --- 1395 UID_UUCP, GID_DIALER, 0660, "cuaa%n", unit); 1396 com->devfs_token_cuai = devfs_add_devswf(&sio_cdevsw, 1397 unit | CALLOUT_MASK | CONTROL_INIT_STATE, DV_CHR, 1398 UID_UUCP, GID_DIALER, 0660, "cuaia%n", unit); 1399 com->devfs_token_cual = devfs_add_devswf(&sio_cdevsw, 1400 unit | CALLOUT_MASK | CONTROL_LOCK_STATE, DV_CHR, 1401 UID_UUCP, GID_DIALER, 0660, "cuala%n", unit); 1402#endif | 1422 printf("\n"); 1423 1424 s = spltty(); 1425 com_addr(unit) = com; 1426 splx(s); 1427 1428 dev = makedev(CDEV_MAJOR, 0); 1429 cdevsw_add(&dev, &sio_cdevsw, NULL); --- 12 unchanged lines hidden (view full) --- 1442 UID_UUCP, GID_DIALER, 0660, "cuaa%n", unit); 1443 com->devfs_token_cuai = devfs_add_devswf(&sio_cdevsw, 1444 unit | CALLOUT_MASK | CONTROL_INIT_STATE, DV_CHR, 1445 UID_UUCP, GID_DIALER, 0660, "cuaia%n", unit); 1446 com->devfs_token_cual = devfs_add_devswf(&sio_cdevsw, 1447 unit | CALLOUT_MASK | CONTROL_LOCK_STATE, DV_CHR, 1448 UID_UUCP, GID_DIALER, 0660, "cuala%n", unit); 1449#endif |
1450 com->id_flags = isdp->id_flags; /* Heritate id_flags for later */ |
|
1403 return (1); 1404} 1405 1406static int 1407sioopen(dev, flag, mode, p) 1408 dev_t dev; 1409 int flag; 1410 int mode; --- 140 unchanged lines hidden (view full) --- 1551 pc98_get_modem_status(com); 1552 com_int_Rx_enable(com); 1553 } else { 1554#endif 1555 (void) inb(com->line_status_port); 1556 (void) inb(com->data_port); 1557 com->prev_modem_status = com->last_modem_status 1558 = inb(com->modem_status_port); | 1451 return (1); 1452} 1453 1454static int 1455sioopen(dev, flag, mode, p) 1456 dev_t dev; 1457 int flag; 1458 int mode; --- 140 unchanged lines hidden (view full) --- 1599 pc98_get_modem_status(com); 1600 com_int_Rx_enable(com); 1601 } else { 1602#endif 1603 (void) inb(com->line_status_port); 1604 (void) inb(com->data_port); 1605 com->prev_modem_status = com->last_modem_status 1606 = inb(com->modem_status_port); |
1559 outb(iobase + com_ier, IER_ERXRDY | IER_ETXRDY | IER_ERLS 1560 | IER_EMSC); | 1607 if (COM_IIR_TXRDYBUG(com)) { 1608 outb(com->intr_ctl_port, IER_ERXRDY | IER_ERLS 1609 | IER_EMSC); 1610 } else { 1611 outb(com->intr_ctl_port, IER_ERXRDY | IER_ETXRDY 1612 | IER_ERLS | IER_EMSC); 1613 } |
1561#ifdef PC98 1562 } 1563#endif 1564 enable_intr(); 1565 /* 1566 * Handle initial DCD. Callout devices get a fake initial 1567 * DCD (trapdoor DCD). If we are callout, then any sleeping 1568 * callin opens get woken up and resume sleeping on "siobi" --- 318 unchanged lines hidden (view full) --- 1887static void 1888siointr1(com) 1889 struct com_s *com; 1890{ 1891 u_char line_status; 1892 u_char modem_status; 1893 u_char *ioptr; 1894 u_char recv_data; | 1614#ifdef PC98 1615 } 1616#endif 1617 enable_intr(); 1618 /* 1619 * Handle initial DCD. Callout devices get a fake initial 1620 * DCD (trapdoor DCD). If we are callout, then any sleeping 1621 * callin opens get woken up and resume sleeping on "siobi" --- 318 unchanged lines hidden (view full) --- 1940static void 1941siointr1(com) 1942 struct com_s *com; 1943{ 1944 u_char line_status; 1945 u_char modem_status; 1946 u_char *ioptr; 1947 u_char recv_data; |
1948 u_char int_ident; 1949 u_char int_ctl; 1950 u_char int_ctl_new; 1951 |
|
1895#ifdef PC98 1896 u_char tmp=0; 1897recv_data=0; 1898#endif /* PC98 */ 1899 | 1952#ifdef PC98 1953 u_char tmp=0; 1954recv_data=0; 1955#endif /* PC98 */ 1956 |
1957 int_ctl = inb(com->intr_ctl_port); 1958 int_ctl_new = int_ctl; 1959 |
|
1900 while (TRUE) { 1901#ifdef PC98 1902status_read:; 1903 if (IS_8251(com->pc98_if_type)) { 1904 tmp = inb(com->sts_port); 1905more_intr: 1906 line_status = 0; 1907 if (tmp & STS8251_TxRDY) line_status |= LSR_TXRDY; --- 158 unchanged lines hidden (view full) --- 2066 ++com->bytes_out; 2067 } 2068#ifdef PC98 2069 if(IS_8251(com->pc98_if_type)) 2070 if ( !(pc98_check_i8251_interrupt(com) & IEN_TxFLAG) ) 2071 com_int_Tx_enable(com); 2072#endif 2073 com->obufq.l_head = ioptr; | 1960 while (TRUE) { 1961#ifdef PC98 1962status_read:; 1963 if (IS_8251(com->pc98_if_type)) { 1964 tmp = inb(com->sts_port); 1965more_intr: 1966 line_status = 0; 1967 if (tmp & STS8251_TxRDY) line_status |= LSR_TXRDY; --- 158 unchanged lines hidden (view full) --- 2126 ++com->bytes_out; 2127 } 2128#ifdef PC98 2129 if(IS_8251(com->pc98_if_type)) 2130 if ( !(pc98_check_i8251_interrupt(com) & IEN_TxFLAG) ) 2131 com_int_Tx_enable(com); 2132#endif 2133 com->obufq.l_head = ioptr; |
2134 if (COM_IIR_TXRDYBUG(com)) { 2135 int_ctl_new = int_ctl | IER_ETXRDY; 2136 } |
|
2074 if (ioptr >= com->obufq.l_tail) { 2075 struct lbq *qp; 2076 2077 qp = com->obufq.l_next; 2078 qp->l_queued = FALSE; 2079 qp = qp->l_next; 2080 if (qp != NULL) { 2081 com->obufq.l_head = qp->l_head; 2082 com->obufq.l_tail = qp->l_tail; 2083 com->obufq.l_next = qp; 2084 } else { 2085 /* output just completed */ | 2137 if (ioptr >= com->obufq.l_tail) { 2138 struct lbq *qp; 2139 2140 qp = com->obufq.l_next; 2141 qp->l_queued = FALSE; 2142 qp = qp->l_next; 2143 if (qp != NULL) { 2144 com->obufq.l_head = qp->l_head; 2145 com->obufq.l_tail = qp->l_tail; 2146 com->obufq.l_next = qp; 2147 } else { 2148 /* output just completed */ |
2149 if ( COM_IIR_TXRDYBUG(com) ) { 2150 int_ctl_new = int_ctl & ~IER_ETXRDY; 2151 } |
|
2086 com->state &= ~CS_BUSY; 2087#if defined(PC98) 2088 if(IS_8251(com->pc98_if_type)) 2089 if ( pc98_check_i8251_interrupt(com) & IEN_TxFLAG ) 2090 com_int_Tx_disable(com); 2091#endif 2092 } 2093 if (!(com->state & CS_ODONE)) { 2094 com_events += LOTS_OF_EVENTS; 2095 com->state |= CS_ODONE; 2096 setsofttty(); /* handle at high level ASAP */ 2097 } 2098 } | 2152 com->state &= ~CS_BUSY; 2153#if defined(PC98) 2154 if(IS_8251(com->pc98_if_type)) 2155 if ( pc98_check_i8251_interrupt(com) & IEN_TxFLAG ) 2156 com_int_Tx_disable(com); 2157#endif 2158 } 2159 if (!(com->state & CS_ODONE)) { 2160 com_events += LOTS_OF_EVENTS; 2161 com->state |= CS_ODONE; 2162 setsofttty(); /* handle at high level ASAP */ 2163 } 2164 } |
2165 if ( COM_IIR_TXRDYBUG(com) && (int_ctl != int_ctl_new)) { 2166 outb(com->intr_ctl_port, int_ctl_new); 2167 } |
|
2099 } 2100#ifdef PC98 2101 else if (line_status & LSR_TXRDY) { 2102 if(IS_8251(com->pc98_if_type)) 2103 if ( pc98_check_i8251_interrupt(com) & IEN_TxFLAG ) 2104 com_int_Tx_disable(com); 2105 } 2106 if(IS_8251(com->pc98_if_type)) --- 2143 unchanged lines hidden --- | 2168 } 2169#ifdef PC98 2170 else if (line_status & LSR_TXRDY) { 2171 if(IS_8251(com->pc98_if_type)) 2172 if ( pc98_check_i8251_interrupt(com) & IEN_TxFLAG ) 2173 com_int_Tx_disable(com); 2174 } 2175 if(IS_8251(com->pc98_if_type)) --- 2143 unchanged lines hidden --- |