diff options
author | asami <asami@FreeBSD.org> | 1996-12-04 04:36:59 +0000 |
---|---|---|
committer | asami <asami@FreeBSD.org> | 1996-12-04 04:36:59 +0000 |
commit | 2ae72b8ddd9e3d81289137f75a03b36b7d18e3f0 (patch) | |
tree | a5bcd2843e1134674e1f3cdbeb7c5a0349020239 | |
parent | 5fdc748d8c34e6924a223a6dd13a1d3c36104b5b (diff) | |
download | FreeBSD-src-2ae72b8ddd9e3d81289137f75a03b36b7d18e3f0.zip FreeBSD-src-2ae72b8ddd9e3d81289137f75a03b36b7d18e3f0.tar.gz |
Syncronize.
Submitted by: The FreeBSD(98) Development Team
-rw-r--r-- | sys/conf/options.pc98 | 4 | ||||
-rw-r--r-- | sys/pc98/cbus/sio.c | 118 | ||||
-rw-r--r-- | sys/pc98/conf/options.pc98 | 4 | ||||
-rw-r--r-- | sys/pc98/i386/machdep.c | 15 | ||||
-rw-r--r-- | sys/pc98/pc98/machdep.c | 15 | ||||
-rw-r--r-- | sys/pc98/pc98/sio.c | 118 |
6 files changed, 176 insertions, 98 deletions
diff --git a/sys/conf/options.pc98 b/sys/conf/options.pc98 index 27e45f9..7519af9 100644 --- a/sys/conf/options.pc98 +++ b/sys/conf/options.pc98 @@ -1,4 +1,4 @@ -# $Id: options.pc98,v 1.10 1996/11/13 02:00:14 asami Exp $ +# $Id: options.pc98,v 1.11 1996/12/04 04:20:13 asami Exp $ BOUNCEPAGES opt_bounce.h USER_LDT MATH_EMULATE opt_math_emulate.h @@ -30,7 +30,7 @@ XSERVER opt_pcvt.h AHC_TAGENABLE opt_aic7xxx.h AHC_SCBPAGING_ENABLE opt_aic7xxx.h -AHC_FORCE_PIO opt_aic7xxx.h +AHC_ALLOW_MEMIO opt_aic7xxx.h AHC_SHARE_SCBS opt_aic7xxx.h CLK_CALIBRATION_LOOP opt_clock.h diff --git a/sys/pc98/cbus/sio.c b/sys/pc98/cbus/sio.c index e84a4cd..65325a5 100644 --- a/sys/pc98/cbus/sio.c +++ b/sys/pc98/cbus/sio.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * from: @(#)com.c 7.5 (Berkeley) 5/16/91 - * $Id: sio.c,v 1.9 1996/11/02 10:39:44 asami Exp $ + * $Id: sio.c,v 1.10 1996/12/04 04:21:07 asami Exp $ */ #include "opt_comconsole.h" @@ -378,6 +378,7 @@ static int espattach __P((struct isa_device *isdp, struct com_s *com, Port_t esp_port)); #endif static int sioattach __P((struct isa_device *dev)); +static timeout_t siobusycheck; static timeout_t siodtrwakeup; static void comhardclose __P((struct com_s *com)); static void siointr1 __P((struct com_s *com)); @@ -422,8 +423,7 @@ static struct cdevsw sio_cdevsw = { }; static int comconsole = -1; -static speed_t comdefaultrate = TTYDEF_SPEED; -static speed_t condefaultrate = CONSPEED; +static speed_t comdefaultrate = CONSPEED; static u_int com_events; /* input chars + weighted output completions */ static int sio_timeout; static int sio_timeouts_until_log; @@ -1131,10 +1131,9 @@ sioattach(isdp) com->it_in.c_cflag = TTYDEF_CFLAG | CLOCAL; com->it_in.c_lflag = TTYDEF_LFLAG; com->lt_out.c_cflag = com->lt_in.c_cflag = CLOCAL; - com->it_in.c_ispeed = com->it_in.c_ospeed = condefaultrate; - } else com->it_in.c_ispeed = com->it_in.c_ospeed = comdefaultrate; - + } else + com->it_in.c_ispeed = com->it_in.c_ospeed = TTYDEF_SPEED; termioschars(&com->it_in); com->it_out = com->it_in; @@ -1696,6 +1695,35 @@ siowrite(dev, uio, flag) } static void +siobusycheck(chan) + void *chan; +{ + struct com_s *com; + int s; + + com = (struct com_s *)chan; + + /* + * Clear TS_BUSY if low-level output is complete. + * spl locking is sufficient because siointr1() does not set CS_BUSY. + * If siointr() clears CS_BUSY after we look at it, then we'll get + * called again. Reading the line status port outside of siointr1() + * is safe because CS_BUSY is clear so there are no output interrupts + * to lose. + */ + s = spltty(); + if (com->state & CS_BUSY) + ; /* False alarm. */ + else if ((inb(com->line_status_port) & (LSR_TSRE | LSR_TXRDY)) + == (LSR_TSRE | LSR_TXRDY)) { + com->tp->t_state &= ~TS_BUSY; + ttwwakeup(com->tp); + } else + timeout(siobusycheck, com, hz / 100); + splx(s); +} + +static void siodtrwakeup(chan) void *chan; { @@ -1796,33 +1824,38 @@ more_intr: #ifdef PC98 } #endif - if (line_status & (LSR_PE|LSR_FE|LSR_BI)) { -#ifdef DDB -#ifdef BREAK_TO_DEBUGGER - if (line_status & LSR_BI - && com->unit == comconsole) { - Debugger("serial console break"); - goto cont; - } -#endif -#endif + if (line_status & (LSR_BI | LSR_FE | LSR_PE)) { /* - Don't store PE if IGNPAR and BI if IGNBRK, - this hack allows "raw" tty optimization - works even if IGN* is set. - */ - if ( com->tp == NULL - || !(com->tp->t_state & TS_ISOPEN) - || (line_status & (LSR_PE|LSR_FE)) - && (com->tp->t_iflag & IGNPAR) - || (line_status & LSR_BI) - && (com->tp->t_iflag & IGNBRK)) - goto cont; - if ( (line_status & (LSR_PE|LSR_FE)) - && (com->tp->t_state & TS_CAN_BYPASS_L_RINT) - && ((line_status & LSR_FE) - || (line_status & LSR_PE) - && (com->tp->t_iflag & INPCK))) + * Don't store BI if IGNBRK or FE/PE if IGNPAR. + * Otherwise, push the work to a higher level + * (to handle PARMRK) if we're bypassing. + * Otherwise, convert BI/FE and PE+INPCK to 0. + * + * This makes bypassing work right in the + * usual "raw" case (IGNBRK set, and IGNPAR + * and INPCK clear). + * + * Note: BI together with FE/PE means just BI. + */ + if (line_status & LSR_BI) { +#if defined(DDB) && defined(BREAK_TO_DEBUGGER) + if (com->unit == comconsole) { + Debugger( + "serial console break"); + goto cont; + } +#endif + if (com->tp == NULL + || com->tp->t_iflag & IGNBRK) + goto cont; + } else { + if (com->tp == NULL + || com->tp->t_iflag & IGNPAR) + goto cont; + } + if (com->tp->t_state & TS_CAN_BYPASS_L_RINT + && (line_status & (LSR_BI | LSR_FE) + || com->tp->t_iflag & INPCK)) recv_data = 0; } @@ -2330,12 +2363,13 @@ repeat: disable_intr(); com_events -= LOTS_OF_EVENTS; com->state &= ~CS_ODONE; - if (!(com->state & CS_BUSY)) - com->tp->t_state &= ~TS_BUSY; enable_intr(); + if (!(com->state & CS_BUSY)) + timeout(siobusycheck, com, hz / 100); (*linesw[tp->t_line].l_start)(tp); } - if (incc <= 0 || !(tp->t_state & TS_ISOPEN)) + if (incc <= 0 || !(tp->t_state & TS_ISOPEN) || + !(tp->t_cflag & CREAD)) continue; /* * Avoid the grotesquely inefficient lineswitch routine @@ -2770,6 +2804,10 @@ siostop(tp, rw) return; disable_intr(); if (rw & FWRITE) { + if (com->hasfifo) + /* XXX does this flush everything? */ + outb(com->iobase + com_fifo, + FIFO_XMT_RST | com->fifo_image); com->obufs[0].l_queued = FALSE; com->obufs[1].l_queued = FALSE; if (com->state & CS_ODONE) @@ -2778,13 +2816,15 @@ siostop(tp, rw) com->tp->t_state &= ~TS_BUSY; } if (rw & FREAD) { + if (com->hasfifo) + /* XXX does this flush everything? */ + outb(com->iobase + com_fifo, + FIFO_RCV_RST | com->fifo_image); com_events -= (com->iptr - com->ibuf); com->iptr = com->ibuf; } enable_intr(); comstart(tp); - - /* XXX should clear h/w fifos too. */ } static struct tty * @@ -3062,7 +3102,7 @@ siocnopen(sp) /* * Save all the device control registers except the fifo register - * and set our default ones (cs8 -parenb speed=condefaultrate). + * and set our default ones (cs8 -parenb speed=comdefaultrate). * We can't save the fifo register since it is read-only. */ iobase = siocniobase; @@ -3079,7 +3119,7 @@ siocnopen(sp) * data input register. This also reduces the effects of the * UMC8669F bug. */ - divisor = ttspeedtab(condefaultrate, comspeedtab); + divisor = ttspeedtab(comdefaultrate, comspeedtab); dlbl = divisor & 0xFF; if (sp->dlbl != dlbl) outb(iobase + com_dlbl, dlbl); diff --git a/sys/pc98/conf/options.pc98 b/sys/pc98/conf/options.pc98 index 27e45f9..7519af9 100644 --- a/sys/pc98/conf/options.pc98 +++ b/sys/pc98/conf/options.pc98 @@ -1,4 +1,4 @@ -# $Id: options.pc98,v 1.10 1996/11/13 02:00:14 asami Exp $ +# $Id: options.pc98,v 1.11 1996/12/04 04:20:13 asami Exp $ BOUNCEPAGES opt_bounce.h USER_LDT MATH_EMULATE opt_math_emulate.h @@ -30,7 +30,7 @@ XSERVER opt_pcvt.h AHC_TAGENABLE opt_aic7xxx.h AHC_SCBPAGING_ENABLE opt_aic7xxx.h -AHC_FORCE_PIO opt_aic7xxx.h +AHC_ALLOW_MEMIO opt_aic7xxx.h AHC_SHARE_SCBS opt_aic7xxx.h CLK_CALIBRATION_LOOP opt_clock.h diff --git a/sys/pc98/i386/machdep.c b/sys/pc98/i386/machdep.c index 78bcb06..a2cc1e2 100644 --- a/sys/pc98/i386/machdep.c +++ b/sys/pc98/i386/machdep.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 - * $Id: machdep.c,v 1.14 1996/12/01 16:34:25 bde Exp $ + * $Id: machdep.c,v 1.15 1996/12/04 04:20:27 asami Exp $ */ #include "npx.h" @@ -289,9 +289,9 @@ again: if (nbuf == 0) { nbuf = 30; if( physmem > 1024) - nbuf += min((physmem - 1024) / 12, 1024); + nbuf += min((physmem - 1024) / 6, 2048); } - nswbuf = min(nbuf, 128); + nswbuf = max(min(nbuf/4, 128), 16); valloc(swbuf, struct buf, nswbuf); valloc(buf, struct buf, nbuf); @@ -329,7 +329,7 @@ again: #ifdef BOUNCE_BUFFERS clean_map = kmem_suballoc(kernel_map, &clean_sva, &clean_eva, - (nbuf*MAXBSIZE) + (nswbuf*MAXPHYS) + + (3*nbuf*DFLTBSIZE/2) + (nswbuf*MAXPHYS) + maxbkva + pager_map_size, TRUE); io_map = kmem_suballoc(clean_map, &minaddr, &maxaddr, maxbkva, FALSE); #else @@ -337,7 +337,7 @@ again: (nbuf*MAXBSIZE) + (nswbuf*MAXPHYS) + pager_map_size, TRUE); #endif buffer_map = kmem_suballoc(clean_map, &buffer_sva, &buffer_eva, - (nbuf*MAXBSIZE), TRUE); + (3*nbuf*DFLTBSIZE/2), TRUE); pager_map = kmem_suballoc(clean_map, &pager_sva, &pager_eva, (nswbuf*MAXPHYS) + pager_map_size, TRUE); exec_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr, @@ -428,7 +428,6 @@ again: max_head, max_head + 1, max_sector, max_sector); } - printf(" %d accounted for\n", bootinfo.bi_n_bios_used); } } @@ -665,8 +664,7 @@ sigreturn(p, uap, retval) p->p_sigacts->ps_sigstk.ss_flags |= SS_ONSTACK; else p->p_sigacts->ps_sigstk.ss_flags &= ~SS_ONSTACK; - p->p_sigmask = scp->sc_mask &~ - (sigmask(SIGKILL)|sigmask(SIGCONT)|sigmask(SIGSTOP)); + p->p_sigmask = scp->sc_mask & ~sigcantmask; regs[tEBP] = scp->sc_fp; regs[tESP] = scp->sc_sp; regs[tEIP] = scp->sc_pc; @@ -979,6 +977,7 @@ init386(first) unsigned biosbasemem, biosextmem; struct gate_descriptor *gdp; int gsel_tss; + struct isa_device *idp; /* table descriptors - used to load tables by microp */ struct region_descriptor r_gdt, r_idt; int pagesinbase, pagesinext; diff --git a/sys/pc98/pc98/machdep.c b/sys/pc98/pc98/machdep.c index 78bcb06..a2cc1e2 100644 --- a/sys/pc98/pc98/machdep.c +++ b/sys/pc98/pc98/machdep.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 - * $Id: machdep.c,v 1.14 1996/12/01 16:34:25 bde Exp $ + * $Id: machdep.c,v 1.15 1996/12/04 04:20:27 asami Exp $ */ #include "npx.h" @@ -289,9 +289,9 @@ again: if (nbuf == 0) { nbuf = 30; if( physmem > 1024) - nbuf += min((physmem - 1024) / 12, 1024); + nbuf += min((physmem - 1024) / 6, 2048); } - nswbuf = min(nbuf, 128); + nswbuf = max(min(nbuf/4, 128), 16); valloc(swbuf, struct buf, nswbuf); valloc(buf, struct buf, nbuf); @@ -329,7 +329,7 @@ again: #ifdef BOUNCE_BUFFERS clean_map = kmem_suballoc(kernel_map, &clean_sva, &clean_eva, - (nbuf*MAXBSIZE) + (nswbuf*MAXPHYS) + + (3*nbuf*DFLTBSIZE/2) + (nswbuf*MAXPHYS) + maxbkva + pager_map_size, TRUE); io_map = kmem_suballoc(clean_map, &minaddr, &maxaddr, maxbkva, FALSE); #else @@ -337,7 +337,7 @@ again: (nbuf*MAXBSIZE) + (nswbuf*MAXPHYS) + pager_map_size, TRUE); #endif buffer_map = kmem_suballoc(clean_map, &buffer_sva, &buffer_eva, - (nbuf*MAXBSIZE), TRUE); + (3*nbuf*DFLTBSIZE/2), TRUE); pager_map = kmem_suballoc(clean_map, &pager_sva, &pager_eva, (nswbuf*MAXPHYS) + pager_map_size, TRUE); exec_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr, @@ -428,7 +428,6 @@ again: max_head, max_head + 1, max_sector, max_sector); } - printf(" %d accounted for\n", bootinfo.bi_n_bios_used); } } @@ -665,8 +664,7 @@ sigreturn(p, uap, retval) p->p_sigacts->ps_sigstk.ss_flags |= SS_ONSTACK; else p->p_sigacts->ps_sigstk.ss_flags &= ~SS_ONSTACK; - p->p_sigmask = scp->sc_mask &~ - (sigmask(SIGKILL)|sigmask(SIGCONT)|sigmask(SIGSTOP)); + p->p_sigmask = scp->sc_mask & ~sigcantmask; regs[tEBP] = scp->sc_fp; regs[tESP] = scp->sc_sp; regs[tEIP] = scp->sc_pc; @@ -979,6 +977,7 @@ init386(first) unsigned biosbasemem, biosextmem; struct gate_descriptor *gdp; int gsel_tss; + struct isa_device *idp; /* table descriptors - used to load tables by microp */ struct region_descriptor r_gdt, r_idt; int pagesinbase, pagesinext; diff --git a/sys/pc98/pc98/sio.c b/sys/pc98/pc98/sio.c index e84a4cd..65325a5 100644 --- a/sys/pc98/pc98/sio.c +++ b/sys/pc98/pc98/sio.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * from: @(#)com.c 7.5 (Berkeley) 5/16/91 - * $Id: sio.c,v 1.9 1996/11/02 10:39:44 asami Exp $ + * $Id: sio.c,v 1.10 1996/12/04 04:21:07 asami Exp $ */ #include "opt_comconsole.h" @@ -378,6 +378,7 @@ static int espattach __P((struct isa_device *isdp, struct com_s *com, Port_t esp_port)); #endif static int sioattach __P((struct isa_device *dev)); +static timeout_t siobusycheck; static timeout_t siodtrwakeup; static void comhardclose __P((struct com_s *com)); static void siointr1 __P((struct com_s *com)); @@ -422,8 +423,7 @@ static struct cdevsw sio_cdevsw = { }; static int comconsole = -1; -static speed_t comdefaultrate = TTYDEF_SPEED; -static speed_t condefaultrate = CONSPEED; +static speed_t comdefaultrate = CONSPEED; static u_int com_events; /* input chars + weighted output completions */ static int sio_timeout; static int sio_timeouts_until_log; @@ -1131,10 +1131,9 @@ sioattach(isdp) com->it_in.c_cflag = TTYDEF_CFLAG | CLOCAL; com->it_in.c_lflag = TTYDEF_LFLAG; com->lt_out.c_cflag = com->lt_in.c_cflag = CLOCAL; - com->it_in.c_ispeed = com->it_in.c_ospeed = condefaultrate; - } else com->it_in.c_ispeed = com->it_in.c_ospeed = comdefaultrate; - + } else + com->it_in.c_ispeed = com->it_in.c_ospeed = TTYDEF_SPEED; termioschars(&com->it_in); com->it_out = com->it_in; @@ -1696,6 +1695,35 @@ siowrite(dev, uio, flag) } static void +siobusycheck(chan) + void *chan; +{ + struct com_s *com; + int s; + + com = (struct com_s *)chan; + + /* + * Clear TS_BUSY if low-level output is complete. + * spl locking is sufficient because siointr1() does not set CS_BUSY. + * If siointr() clears CS_BUSY after we look at it, then we'll get + * called again. Reading the line status port outside of siointr1() + * is safe because CS_BUSY is clear so there are no output interrupts + * to lose. + */ + s = spltty(); + if (com->state & CS_BUSY) + ; /* False alarm. */ + else if ((inb(com->line_status_port) & (LSR_TSRE | LSR_TXRDY)) + == (LSR_TSRE | LSR_TXRDY)) { + com->tp->t_state &= ~TS_BUSY; + ttwwakeup(com->tp); + } else + timeout(siobusycheck, com, hz / 100); + splx(s); +} + +static void siodtrwakeup(chan) void *chan; { @@ -1796,33 +1824,38 @@ more_intr: #ifdef PC98 } #endif - if (line_status & (LSR_PE|LSR_FE|LSR_BI)) { -#ifdef DDB -#ifdef BREAK_TO_DEBUGGER - if (line_status & LSR_BI - && com->unit == comconsole) { - Debugger("serial console break"); - goto cont; - } -#endif -#endif + if (line_status & (LSR_BI | LSR_FE | LSR_PE)) { /* - Don't store PE if IGNPAR and BI if IGNBRK, - this hack allows "raw" tty optimization - works even if IGN* is set. - */ - if ( com->tp == NULL - || !(com->tp->t_state & TS_ISOPEN) - || (line_status & (LSR_PE|LSR_FE)) - && (com->tp->t_iflag & IGNPAR) - || (line_status & LSR_BI) - && (com->tp->t_iflag & IGNBRK)) - goto cont; - if ( (line_status & (LSR_PE|LSR_FE)) - && (com->tp->t_state & TS_CAN_BYPASS_L_RINT) - && ((line_status & LSR_FE) - || (line_status & LSR_PE) - && (com->tp->t_iflag & INPCK))) + * Don't store BI if IGNBRK or FE/PE if IGNPAR. + * Otherwise, push the work to a higher level + * (to handle PARMRK) if we're bypassing. + * Otherwise, convert BI/FE and PE+INPCK to 0. + * + * This makes bypassing work right in the + * usual "raw" case (IGNBRK set, and IGNPAR + * and INPCK clear). + * + * Note: BI together with FE/PE means just BI. + */ + if (line_status & LSR_BI) { +#if defined(DDB) && defined(BREAK_TO_DEBUGGER) + if (com->unit == comconsole) { + Debugger( + "serial console break"); + goto cont; + } +#endif + if (com->tp == NULL + || com->tp->t_iflag & IGNBRK) + goto cont; + } else { + if (com->tp == NULL + || com->tp->t_iflag & IGNPAR) + goto cont; + } + if (com->tp->t_state & TS_CAN_BYPASS_L_RINT + && (line_status & (LSR_BI | LSR_FE) + || com->tp->t_iflag & INPCK)) recv_data = 0; } @@ -2330,12 +2363,13 @@ repeat: disable_intr(); com_events -= LOTS_OF_EVENTS; com->state &= ~CS_ODONE; - if (!(com->state & CS_BUSY)) - com->tp->t_state &= ~TS_BUSY; enable_intr(); + if (!(com->state & CS_BUSY)) + timeout(siobusycheck, com, hz / 100); (*linesw[tp->t_line].l_start)(tp); } - if (incc <= 0 || !(tp->t_state & TS_ISOPEN)) + if (incc <= 0 || !(tp->t_state & TS_ISOPEN) || + !(tp->t_cflag & CREAD)) continue; /* * Avoid the grotesquely inefficient lineswitch routine @@ -2770,6 +2804,10 @@ siostop(tp, rw) return; disable_intr(); if (rw & FWRITE) { + if (com->hasfifo) + /* XXX does this flush everything? */ + outb(com->iobase + com_fifo, + FIFO_XMT_RST | com->fifo_image); com->obufs[0].l_queued = FALSE; com->obufs[1].l_queued = FALSE; if (com->state & CS_ODONE) @@ -2778,13 +2816,15 @@ siostop(tp, rw) com->tp->t_state &= ~TS_BUSY; } if (rw & FREAD) { + if (com->hasfifo) + /* XXX does this flush everything? */ + outb(com->iobase + com_fifo, + FIFO_RCV_RST | com->fifo_image); com_events -= (com->iptr - com->ibuf); com->iptr = com->ibuf; } enable_intr(); comstart(tp); - - /* XXX should clear h/w fifos too. */ } static struct tty * @@ -3062,7 +3102,7 @@ siocnopen(sp) /* * Save all the device control registers except the fifo register - * and set our default ones (cs8 -parenb speed=condefaultrate). + * and set our default ones (cs8 -parenb speed=comdefaultrate). * We can't save the fifo register since it is read-only. */ iobase = siocniobase; @@ -3079,7 +3119,7 @@ siocnopen(sp) * data input register. This also reduces the effects of the * UMC8669F bug. */ - divisor = ttspeedtab(condefaultrate, comspeedtab); + divisor = ttspeedtab(comdefaultrate, comspeedtab); dlbl = divisor & 0xFF; if (sp->dlbl != dlbl) outb(iobase + com_dlbl, dlbl); |