--- Net2/arch/i386/isa/com.c 2018/04/24 18:07:10 1.1.1.3 +++ Net2/arch/i386/isa/com.c 2018/04/24 18:12:06 1.1.1.4 @@ -31,8 +31,18 @@ * SUCH DAMAGE. * * @(#)com.c 7.5 (Berkeley) 5/16/91 + * + * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE + * -------------------- ----- ---------------------- + * CURRENT PATCH LEVEL: 4 00079 + * -------------------- ----- ---------------------- + * + * 23 Sep 92 Rodney W. Grimes Fix SILO overflow on 16550 UARTS + * 30 Aug 92 Poul-Henning Kamp Stabilize SLIP on lossy lines/UARTS + * 09 Aug 92 Christoph Robitschko Correct minor number on com ports + * 10 Feb 93 Jordan K. Hubbard Added select code */ -static char rcsid[] = "$Header: /var/lib/cvsd/net2/Net2/arch/i386/isa/com.c,v 1.1.1.3 2018/04/24 18:07:10 root Exp $"; +static char rcsid[] = "$Header: /var/lib/cvsd/net2/Net2/arch/i386/isa/com.c,v 1.1.1.4 2018/04/24 18:12:06 root Exp $"; #include "com.h" #if NCOM > 0 @@ -51,6 +61,7 @@ static char rcsid[] = "$Header: /var/lib #include "uio.h" #include "kernel.h" #include "syslog.h" +#include "types.h" #include "i386/isa/isa_device.h" #include "i386/isa/comreg.h" @@ -108,7 +119,7 @@ extern int kgdb_rate; extern int kgdb_debug_init; #endif -#define UNIT(x) (minor(x)-1) +#define UNIT(x) (minor(x)) comprobe(dev) struct isa_device *dev; @@ -118,7 +129,7 @@ struct isa_device *dev; outb(dev->id_iobase+com_iir, 0); DELAY(100); if ((inb(dev->id_iobase+com_iir) & 0x38) == 0) - return(1); + return(8); return(0); } @@ -131,7 +142,7 @@ struct isa_device *isdp; u_char unit; int port = isdp->id_iobase; - unit = isdp->id_unit - 1; + unit = isdp->id_unit; if (unit == comconsole) DELAY(1000); com_addr[unit] = port; @@ -139,17 +150,17 @@ struct isa_device *isdp; comsoftCAR |= 1 << unit; /* XXX */ /* look for a NS 16550AF UART with FIFOs */ - outb(port+com_fifo, FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_14); + outb(port+com_fifo, FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_4); DELAY(100); if ((inb(port+com_iir) & IIR_FIFO_MASK) == IIR_FIFO_MASK) { com_hasfifo |= 1 << unit; - printf(" fifo"); + printf("com%d: fifo\n", isdp->id_unit); } outb(port+com_ier, 0); outb(port+com_mcr, 0 | MCR_IENABLE); #ifdef KGDB - if (kgdb_dev == makedev(commajor, unit+1)) { + if (kgdb_dev == makedev(commajor, unit)) { if (comconsole == unit) kgdb_dev = -1; /* can't debug over console port */ else { @@ -239,7 +250,7 @@ comclose(dev, flag, mode, p) outb(com+com_cfcr, inb(com+com_cfcr) & ~CFCR_SBREAK); #ifdef KGDB /* do not disable interrupts if debugging */ - if (kgdb_dev != makedev(commajor, unit+1)) + if (kgdb_dev != makedev(commajor, unit)) #endif outb(com+com_ier, 0); if (tp->t_cflag&HUPCL || tp->t_state&TS_WOPEN || @@ -283,7 +294,7 @@ comintr(unit) register u_char code; register struct tty *tp; - unit--; + unit; com = com_addr[unit]; while (1) { code = inb(com+com_iir); @@ -300,7 +311,7 @@ comintr(unit) #define RCVBYTE() \ code = inb(com+com_data); \ if ((tp->t_state & TS_ISOPEN) == 0) { \ - if (kgdb_dev == makedev(commajor, unit+1) && \ + if (kgdb_dev == makedev(commajor, unit) && \ code == FRAME_END) \ kgdb_connect(0); /* trap into kgdb */ \ } else \ @@ -359,7 +370,7 @@ comeint(unit, stat, com) #ifdef KGDB /* we don't care about parity errors */ if (((stat & (LSR_BI|LSR_FE|LSR_PE)) == LSR_PE) && - kgdb_dev == makedev(commajor, unit+1) && c == FRAME_END) + kgdb_dev == makedev(commajor, unit) && c == FRAME_END) kgdb_connect(0); /* trap into kgdb */ #endif return; @@ -368,8 +379,10 @@ comeint(unit, stat, com) c |= TTY_FE; else if (stat & LSR_PE) c |= TTY_PE; - else if (stat & LSR_OE) + else if (stat & LSR_OE) { /* 30 Aug 92*/ + c |= TTY_PE; /* Ought to have it's own define... */ log(LOG_WARNING, "com%d: silo overflow\n", unit); + } (*linesw[tp->t_line].l_rint)(c, tp); } @@ -503,7 +516,7 @@ comparam(tp, t) outb(com+com_cfcr, cfcr); if (com_hasfifo & (1 << unit)) - outb(com+com_fifo, FIFO_ENABLE | FIFO_TRIGGER_14); + outb(com+com_fifo, FIFO_ENABLE | FIFO_TRIGGER_4); return(0); } @@ -616,7 +629,7 @@ comcnprobe(cp) /* make sure hardware exists? XXX */ /* initialize required fields */ - cp->cn_dev = makedev(commajor, unit+1); + cp->cn_dev = makedev(commajor, unit); cp->cn_tp = &com_tty[unit]; #ifdef COMCONSOLE cp->cn_pri = CN_REMOTE; /* Force a serial port console */ @@ -653,7 +666,7 @@ cominit(unit, rate) outb(com+com_ier, rate >> 8); outb(com+com_cfcr, CFCR_8BITS); outb(com+com_ier, IER_ERXRDY | IER_ETXRDY); - outb(com+com_fifo, FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_14); + outb(com+com_fifo, FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_4); stat = inb(com+com_iir); splx(s); } @@ -711,4 +724,45 @@ comcnputc(dev, c) stat = inb(com+com_iir); splx(s); } + +int +comselect(dev, rw, p) + dev_t dev; + int rw; + struct proc *p; +{ + register struct tty *tp = &com_tty[UNIT(dev)]; + int nread; + int s = spltty(); + struct proc *selp; + + switch (rw) { + + case FREAD: + nread = ttnread(tp); + if (nread > 0 || + ((tp->t_cflag&CLOCAL) == 0 && (tp->t_state&TS_CARR_ON) == 0)) + goto win; + if (tp->t_rsel && (selp = pfind(tp->t_rsel)) && selp->p_wchan == (caddr_t)&selwait) + tp->t_state |= TS_RCOLL; + else + tp->t_rsel = p->p_pid; + break; + + case FWRITE: + if (RB_LEN(&tp->t_out) <= tp->t_lowat) + goto win; + if (tp->t_wsel && (selp = pfind(tp->t_wsel)) && selp->p_wchan == (caddr_t)&selwait) + tp->t_state |= TS_WCOLL; + else + tp->t_wsel = p->p_pid; + break; + } + splx(s); + return (0); + win: + splx(s); + return (1); +} + #endif