diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2002-05-02 22:56:08 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2002-05-02 22:56:08 +0000 |
commit | f69ff2bae348f49f6e5fccbf1594b839e98792ef (patch) | |
tree | 984c07207f03eebcb847988db98df196a848c27e /sys/arch/alpha/tc/scc.c | |
parent | d7aff648af7518e317842f78e06a3d197eca9629 (diff) |
Big TURBOchannel support catchup from NetBSD, part 1.
A few local changes and tweaks remain.
This bring DEC 3000 machines back in the game, but framebuffers are still
not supported at the moment.
Thanks to ericj@ and nate@ for supplying me a DEC 3000 for testing.
Diffstat (limited to 'sys/arch/alpha/tc/scc.c')
-rw-r--r-- | sys/arch/alpha/tc/scc.c | 352 |
1 files changed, 90 insertions, 262 deletions
diff --git a/sys/arch/alpha/tc/scc.c b/sys/arch/alpha/tc/scc.c index bfba120fca3..b1734b53296 100644 --- a/sys/arch/alpha/tc/scc.c +++ b/sys/arch/alpha/tc/scc.c @@ -1,5 +1,5 @@ -/* $OpenBSD: scc.c,v 1.14 2002/03/15 01:20:04 millert Exp $ */ -/* $NetBSD: scc.c,v 1.28 1996/12/05 01:39:43 cgd Exp $ */ +/* $OpenBSD: scc.c,v 1.15 2002/05/02 22:56:06 miod Exp $ */ +/* $NetBSD: scc.c,v 1.58 2002/03/17 19:40:27 atatat Exp $ */ /* * Copyright (c) 1991,1990,1989,1994,1995,1996 Carnegie Mellon University @@ -11,7 +11,7 @@ * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. * @@ -64,9 +64,6 @@ * @(#)scc.c 8.2 (Berkeley) 11/30/93 */ -#include "scc.h" - -#if NSCC > 0 /* * Intel 82530 dual usart chip driver. Supports the serial port(s) on the * Personal DECstation 5000/xx and DECstation 5000/1xx, plus the keyboard @@ -81,7 +78,6 @@ #include <sys/tty.h> #include <sys/proc.h> #include <sys/buf.h> -#include <sys/conf.h> #include <sys/file.h> #include <sys/uio.h> #include <sys/kernel.h> @@ -94,42 +90,27 @@ #include <alpha/tc/sccreg.h> #include <alpha/tc/sccvar.h> -#include <machine/autoconf.h> /* For the badaddr() proto */ #include <machine/rpb.h> +#include <machine/conf.h> #include <dev/tc/tcvar.h> -#include <alpha/tc/ioasicreg.h> +#include <dev/tc/ioasicreg.h> #include <dev/tc/ioasicvar.h> #undef SCCDEV #define SCCDEV 15 /* XXX */ -/* - * rcons glass-tty console (as used on pmax) needs lk-201 ASCII input - * support from the tty drivers. This is ugly and broken and won't - * compile on Alphas. - */ +#define raster_console() 1 /* Treat test for cn_screen as true */ +#define CONSOLE_ON_UNIT(unit) 0 /* No raster console on Alphas */ #define NSCCLINE (NSCC*2) #define SCCUNIT(dev) (minor(dev) >> 1) #define SCCLINE(dev) (minor(dev) & 0x1) -/* QVSS-compatible in-kernel X input event parser, pointer tracker */ -void (*sccDivertXInput)(int cc); /* X windows keyboard input routine */ -void (*sccMouseEvent)(int); /* X windows mouse motion event routine */ -void (*sccMouseButtons)(int); /* X windows mouse buttons event routine */ #ifdef DEBUG int debugChar; #endif -struct pdma { - void *p_addr; - char *p_mem; - char *p_end; - int p_arg; - void (*p_fcn)(struct tty *tp); -}; - struct scc_softc { struct device sc_dv; struct pdma scc_pdma[2]; @@ -192,11 +173,7 @@ struct speedtab sccspeedtab[] = { #endif /* Definition of the driver for autoconfig. */ -#ifdef __BROKEN_INDIRECT_CONFIG int sccmatch(struct device *, void *, void *); -#else -int sccmatch(struct device *, struct cfdata *, void *); -#endif void sccattach(struct device *, struct device *, void *); struct cfattach scc_ca = { @@ -209,104 +186,46 @@ struct cfdriver scc_cd = { cdev_decl(scc); +int sccGetc(dev_t); +void sccPutc(dev_t, int); +void sccPollc(dev_t, int); +int sccparam(struct tty *, struct termios *); +void sccstart(struct tty *); + +int sccmctl(struct scc_softc *, int, int, int); int cold_sccparam(struct tty *, struct termios *, - struct scc_softc *sc); -int sccGetc(dev_t); -void sccPollc(dev_t, int); -void sccPutc(dev_t, int); -int sccintr(void *); -int sccmctl(dev_t, int, int); -int sccparam(struct tty *, struct termios *); -void sccreset(struct scc_softc *); -void sccstart(struct tty *); -void scc_alphaintr(int); -void scc_modem_intr(dev_t); + struct scc_softc *sc, int line); + #ifdef SCC_DEBUG -void scc_rr(char *, scc_regmap_t *); +void rr(char *, scc_regmap_t *); #endif +void scc_modem_intr(dev_t); +void sccreset(struct scc_softc *); + +int sccintr(void *); +void scc_alphaintr(int); /* * console variables, for using serial console while still cold and * autoconfig has not attached the scc device. */ scc_regmap_t *scc_cons_addr = 0; -static struct scc_softc coldcons_softc; -static struct consdev scccons = { +struct consdev scccons = { NULL, NULL, sccGetc, sccPutc, sccPollc, NULL, NODEV, 0 }; -void scc_consinit(dev_t dev, scc_regmap_t *sccaddr); -void scc_oconsinit(struct scc_softc *, dev_t); - - -/* - * Set up a given unit as a serial console device. - * We need console output when cold, and before any device is configured. - * Should be callable when cold, to reset the chip and set parameters - * for a remote (serial) console or kgdb line. - * XXX - * As most DECstations only bring out one rs-232 lead from an SCC - * to the bulkhead, and use the other for mouse and keyboard, we - * only allow one unit per SCC to be console. - */ -void -scc_consinit(dev, sccaddr) - dev_t dev; - scc_regmap_t *sccaddr; -{ - struct scc_softc *sc; - struct termios cterm; - struct tty ctty; - int s; - - /* Save address in case we're cold. */ - if (cold && scc_cons_addr == 0) { - scc_cons_addr = sccaddr; - sc = &coldcons_softc; - coldcons_softc.scc_pdma[0].p_addr = sccaddr; - coldcons_softc.scc_pdma[1].p_addr = sccaddr; - } else { - /* being called from sccattach() to reset console */ - sc = scc_cd.cd_devs[SCCUNIT(dev)]; - } - - /* Reset chip. */ - sccreset(sc); - /* XXX make sure sccreset() called only once for this chip? */ - - /* set console-line parameters */ - s = spltty(); - ctty.t_dev = dev; - scccons.cn_dev = dev; - cterm.c_cflag = CS8; - cterm.c_ospeed = cterm.c_ispeed = 9600; - (void) cold_sccparam(&ctty, &cterm, sc); - *cn_tab = scccons; - DELAY(1000); - splx(s); -} /* * Test to see if device is present. * Return true if found. */ int -#ifdef __BROKEN_INDIRECT_CONFIG -sccmatch(parent, cfdata, aux) -#else -sccmatch(parent, cf, aux) -#endif +sccmatch(parent, vcf, aux) struct device *parent; -#ifdef __BROKEN_INDIRECT_CONFIG - void *cfdata; -#else - struct cfdata *cf; -#endif - void *aux; + void *vcf, *aux; { -#ifdef __BROKEN_INDIRECT_CONFIG - struct cfdata *cf = cfdata; -#endif + extern struct cfdriver ioasic_cd; /* XXX */ struct ioasicdev_attach_args *d = aux; + struct cfdata *cf = vcf; void *sccaddr; if (parent->dv_cfdata->cf_driver != &ioasic_cd) { @@ -321,8 +240,12 @@ sccmatch(parent, cf, aux) (strncmp(d->iada_modname, "scc", TC_ROM_LLEN)!= 0)) return (0); - /* XXX MATCH CFLOC */ - if (cf->cf_unit >= NSCC) + /* + * Check user-specified offset against the ioasic offset. + * Allow it to be wildcarded. + */ + if (cf->cf_loc[0] != -1 && + cf->cf_loc[0] != d->iada_offset) return (0); /* Get the address, and check it for validity. */ @@ -345,18 +268,18 @@ scc_alphaintr(onoff) int onoff; { if (onoff) { - *(volatile u_int *)IOASIC_REG_IMSK(ioasic_base) |= + *(volatile u_int *)(ioasic_base + IOASIC_IMSK) |= IOASIC_INTR_SCC_1 | IOASIC_INTR_SCC_0; #if !defined(DEC_3000_300) && defined(SCC_DMA) - *(volatile u_int *)IOASIC_REG_CSR(ioasic_base) |= + *(volatile u_int *)(ioasic_base + IOASIC_CSR) |= IOASIC_CSR_DMAEN_T1 | IOASIC_CSR_DMAEN_R1 | IOASIC_CSR_DMAEN_T2 | IOASIC_CSR_DMAEN_R2; #endif } else { - *(volatile u_int *)IOASIC_REG_IMSK(ioasic_base) &= + *(volatile u_int *)(ioasic_base + IOASIC_IMSK) &= ~(IOASIC_INTR_SCC_1 | IOASIC_INTR_SCC_0); #if !defined(DEC_3000_300) && defined(SCC_DMA) - *(volatile u_int *)IOASIC_REG_CSR(ioasic_base) &= + *(volatile u_int *)(ioasic_base + IOASIC_CSR) &= ~(IOASIC_CSR_DMAEN_T1 | IOASIC_CSR_DMAEN_R1 | IOASIC_CSR_DMAEN_T2 | IOASIC_CSR_DMAEN_R2); #endif @@ -379,7 +302,9 @@ sccattach(parent, self, aux) struct termios cterm; struct tty ctty; int s; - extern int cputype; + int unit; + + unit = sc->sc_dv.dv_unit; /* Get the address, and check it for validity. */ sccaddr = (void *)d->iada_addr; @@ -395,15 +320,9 @@ sccattach(parent, self, aux) * For a remote console, wait a while for previous output to * complete. */ -#ifdef TK_NOTYET - if (major(cn_tab.cn_dev) == SCCDEV && cn_tab.cn_screen == 0 && - SCCUNIT(cn_tab.cn_dev) == cp->pmax_unit) - DELAY(10000); -#else if ((cputype == ST_DEC_3000_500 && sc->sc_dv.dv_unit == 1) || (cputype == ST_DEC_3000_300 && sc->sc_dv.dv_unit == 0)) DELAY(10000); -#endif pdp = &sc->scc_pdma[0]; /* init pseudo DMA structures */ @@ -413,12 +332,12 @@ sccattach(parent, self, aux) if (cntr == 0) tty_attach(tp); pdp->p_arg = (long)tp; - pdp->p_fcn = (void (*)(struct tty*))0; + pdp->p_fcn = (void (*)__P((struct tty*)))0; tp->t_dev = (dev_t)((sc->sc_dv.dv_unit << 1) | cntr); pdp++; } /* What's the warning here? Defaulting to softCAR on line 2? */ - sc->scc_softCAR = 0x2; /* XXX */ + sc->scc_softCAR = sc->sc_dv.dv_cfdata->cf_flags | 0x2; /* XXX */ /* reset chip, initialize register-copies in softc */ sccreset(sc); @@ -426,50 +345,14 @@ sccattach(parent, self, aux) /* * Special handling for consoles. */ - if (0 /* cn_tab.cn_screen */) { - if (1 /* cn_tab.cn_kbdgetc == sccGetc */) { - if (sc->sc_dv.dv_unit == 1) { - s = spltty(); - ctty.t_dev = makedev(SCCDEV, SCCKBD_PORT); - cterm.c_cflag = CS8; - cterm.c_ospeed = cterm.c_ispeed = 4800; - (void) sccparam(&ctty, &cterm); - DELAY(10000); -#ifdef notyet - /* - * For some reason doing this hangs the 3min - * during booting. Fortunately the keyboard - * works ok without it. - */ - KBDReset(ctty.t_dev, sccPutc); -#endif - DELAY(10000); - splx(s); - } else if (sc->sc_dv.dv_unit == 0) { - s = spltty(); - ctty.t_dev = makedev(SCCDEV, SCCMOUSE_PORT); - cterm.c_cflag = CS8 | PARENB | PARODD; - cterm.c_ospeed = cterm.c_ispeed = 4800; - (void) sccparam(&ctty, &cterm); -#ifdef TK_NOTYET - DELAY(10000); - MouseInit(ctty.t_dev, sccPutc, sccGetc); - DELAY(10000); -#endif - splx(s); - } - } - } else if (1 /* SCCUNIT(cn_tab.cn_dev) == sc->sc_dv.dv_unit */) { + if (1 /* SCCUNIT(cn_tab.cn_dev) == sc->sc_dv.dv_unit */) { s = spltty(); - ctty.t_dev = makedev(SCCDEV, - sc->sc_dv.dv_unit == 0 ? SCCCOMM2_PORT : SCCCOMM3_PORT); cterm.c_cflag = (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8; cterm.c_ospeed = cterm.c_ispeed = 9600; - (void) sccparam(&ctty, &cterm); + (void) cold_sccparam(&ctty, &cterm, sc, + SCCLINE((sc->sc_dv.dv_unit == 0) ? + SCCCOMM2_PORT : SCCCOMM3_PORT)); DELAY(1000); -#ifdef TK_NOTYET - cn_tab.cn_disabled = 0; -#endif splx(s); } @@ -479,10 +362,12 @@ sccattach(parent, self, aux) */ if ((cputype == ST_DEC_3000_500 && sc->sc_dv.dv_unit == 1) || (cputype == ST_DEC_3000_300 && sc->sc_dv.dv_unit == 0)) { + if (alpha_donot_kludge_scc) + printf("\nSWITCHING TO SERIAL CONSOLE!\n"); cn_tab = &scccons; cn_tab->cn_dev = makedev(SCCDEV, sc->sc_dv.dv_unit * 2); - printf(": console\n"); + printf("%s console\n", alpha_donot_kludge_scc ? "\n***" : ":"); /* wire carrier for console. */ sc->scc_softCAR |= SCCLINE(cn_tab->cn_dev); @@ -566,6 +451,7 @@ sccopen(dev, flag, mode, p) register struct tty *tp; register int unit, line; int s, error = 0; + int firstopen = 0; unit = SCCUNIT(dev); if (unit >= scc_cd.cd_ndevs) @@ -586,8 +472,8 @@ sccopen(dev, flag, mode, p) tp->t_param = sccparam; tp->t_dev = dev; if ((tp->t_state & TS_ISOPEN) == 0) { - tp->t_state |= TS_WOPEN; ttychars(tp); + firstopen = 1; #ifndef PORTSELECTOR if (tp->t_ispeed == 0) { #endif @@ -605,19 +491,23 @@ sccopen(dev, flag, mode, p) ttsetwater(tp); } else if ((tp->t_state & TS_XCLUDE) && curproc->p_ucred->cr_uid != 0) return (EBUSY); - (void) sccmctl(dev, DML_DTR, DMSET); + (void) sccmctl(sc, SCCLINE(dev), DML_DTR, DMSET); s = spltty(); while (!(flag & O_NONBLOCK) && !(tp->t_cflag & CLOCAL) && !(tp->t_state & TS_CARR_ON)) { tp->t_state |= TS_WOPEN; - if ((error = ttysleep(tp, (caddr_t)&tp->t_rawq, TTIPRI | PCATCH, - ttopen, 0)) != 0) + error = ttysleep(tp, (caddr_t)&tp->t_rawq, TTIPRI | PCATCH, + ttopen, 0); + tp->t_state &= ~TS_WOPEN; + if (error != 0) break; } splx(s); if (error) return (error); - return ((*linesw[tp->t_line].l_open)(dev, tp)); + error = (*linesw[tp->t_line].l_open)(dev, tp); + + return (error); } /*ARGSUSED*/ @@ -640,7 +530,7 @@ sccclose(dev, flag, mode, p) (*linesw[tp->t_line].l_close)(tp, flag); if ((tp->t_cflag & HUPCL) || (tp->t_state & TS_WOPEN) || !(tp->t_state & TS_ISOPEN)) - (void) sccmctl(dev, 0, DMSET); + (void) sccmctl(sc, line, 0, DMSET); return (ttyclose(tp)); } @@ -722,27 +612,27 @@ sccioctl(dev, cmd, data, flag, p) break; case TIOCSDTR: - (void) sccmctl(dev, DML_DTR|DML_RTS, DMBIS); + (void) sccmctl(sc, line, DML_DTR|DML_RTS, DMBIS); break; case TIOCCDTR: - (void) sccmctl(dev, DML_DTR|DML_RTS, DMBIC); + (void) sccmctl(sc, line, DML_DTR|DML_RTS, DMBIC); break; case TIOCMSET: - (void) sccmctl(dev, *(int *)data, DMSET); + (void) sccmctl(sc, line, *(int *)data, DMSET); break; case TIOCMBIS: - (void) sccmctl(dev, *(int *)data, DMBIS); + (void) sccmctl(sc, line, *(int *)data, DMBIS); break; case TIOCMBIC: - (void) sccmctl(dev, *(int *)data, DMBIC); + (void) sccmctl(sc, line, *(int *)data, DMBIC); break; case TIOCMGET: - *(int *)data = sccmctl(dev, 0, DMGET); + *(int *)data = sccmctl(sc, line, 0, DMGET); break; default: @@ -765,7 +655,7 @@ sccparam(tp, t) /* Extract the softc and call cold_sccparam to do all the work. */ sc = scc_cd.cd_devs[SCCUNIT(tp->t_dev)]; - return cold_sccparam(tp, t, sc); + return cold_sccparam(tp, t, sc, SCCLINE(tp->t_dev)); } @@ -773,13 +663,13 @@ sccparam(tp, t) * Do what sccparam() (t_param entry point) does, but callable when cold. */ int -cold_sccparam(tp, t, sc) +cold_sccparam(tp, t, sc, line) register struct tty *tp; register struct termios *t; register struct scc_softc *sc; + register int line; { register scc_regmap_t *regs; - register int line; register u_char value, wvalue; register int cflag = t->c_cflag; int ospeed; @@ -798,27 +688,15 @@ cold_sccparam(tp, t, sc) /* * Handle console specially. */ -#ifdef HAVE_RCONS - if (cn_tab->cn_getc == LKgetc) { - if (minor(tp->t_dev) == SCCKBD_PORT) { - cflag = CS8; - ospeed = ttspeedtab(4800, sccspeedtab); - } else if (minor(tp->t_dev) == SCCMOUSE_PORT) { - cflag = CS8 | PARENB | PARODD; - ospeed = ttspeedtab(4800, sccspeedtab); - } - } else if (tp->t_dev == cn_tab->cn_dev) -#endif /*HAVE_RCONS*/ { cflag = CS8; ospeed = ttspeedtab(9600, sccspeedtab); } if (ospeed == 0) { - (void) sccmctl(tp->t_dev, 0, DMSET); /* hang up line */ + (void) sccmctl(sc, line, 0, DMSET); /* hang up line */ return (0); } - line = SCCLINE(tp->t_dev); regs = (scc_regmap_t *)sc->scc_pdma[line].p_addr; /* @@ -903,12 +781,10 @@ cold_sccparam(tp, t, sc) value = sc->scc_wreg[line].wr14; SCC_WRITE_REG(regs, line, SCC_WR14, value); -#ifdef alpha - if (SCCUNIT(tp->t_dev) == 1) { + if (sc->sc_dv.dv_unit == 1) { /* On unit one, on the flamingo, modem control is floating! */ value = ZSWR15_BREAK_IE; } else -#endif { value = ZSWR15_BREAK_IE | ZSWR15_CTS_IE | ZSWR15_DCD_IE; } @@ -927,9 +803,7 @@ cold_sccparam(tp, t, sc) SCC_WRITE_REG(regs, line, SCC_WR1, sc->scc_wreg[line].wr1); tc_mb(); -#ifdef alpha scc_alphaintr(1); /* XXX XXX XXX */ -#endif /*alpha*/ return (0); } @@ -981,10 +855,7 @@ sccintr(xxxsc) (caddr_t) tp->t_outq.c_cf); dp->p_end = dp->p_mem = tp->t_outq.c_cf; } - if (tp->t_line) - (*linesw[tp->t_line].l_start)(tp); - else - sccstart(tp); + (*linesw[tp->t_line].l_start)(tp); if (tp->t_outq.c_cc == 0 || !(tp->t_state & TS_BUSY)) { SCC_READ_REG(regs, chan, SCC_RR15, cc); cc &= ~ZSWR15_TXUEOM_IE; @@ -1015,39 +886,6 @@ sccintr(xxxsc) } } - /* - * Keyboard needs special treatment. - */ - if (tp == scctty(makedev(SCCDEV, SCCKBD_PORT)) /* && cn_tab.cn_screen */) { -#ifdef KADB - if (cc == LK_DO) { - spl0(); - kdbpanic(); - return 0; /* XXX */ - } -#endif -#ifdef DEBUG - debugChar = cc; -#endif - if (sccDivertXInput) { - (*sccDivertXInput)(cc); - continue; - } -#ifdef TK_NOTYET - if ((cc = kbdMapChar(cc)) < 0) - continue; -#endif - /* - * Now for mousey - */ - } else if (tp == scctty(makedev(SCCDEV, SCCMOUSE_PORT)) && - sccMouseButtons) { -#ifdef HAVE_RCONS - /*XXX*/ - mouseInput(cc); -#endif - continue; - } if (!(tp->t_state & TS_ISOPEN)) { wakeup((caddr_t)&tp->t_rawq); #ifdef PORTSELECTOR @@ -1100,7 +938,7 @@ sccstart(tp) if (tp->t_outq.c_cc == 0) goto out; /* handle console specially */ - if (tp == scctty(makedev(SCCDEV,SCCKBD_PORT)) /* && cn_tab.cn_screen */) { + if (tp == scctty(makedev(SCCDEV,SCCKBD_PORT)) && raster_console()) { while (tp->t_outq.c_cc > 0) { cc = getc(&tp->t_outq) & 0x7f; cnputc(cc); @@ -1174,18 +1012,15 @@ sccstop(tp, flag) } int -sccmctl(dev, bits, how) - dev_t dev; - int bits, how; +sccmctl(sc, line, bits, how) + struct scc_softc *sc; + int line, bits, how; { - register struct scc_softc *sc; register scc_regmap_t *regs; - register int line, mbits; + register int mbits; register u_char value; int s; - sc = scc_cd.cd_devs[SCCUNIT(dev)]; - line = SCCLINE(dev); regs = (scc_regmap_t *)sc->scc_pdma[line].p_addr; s = spltty(); /* @@ -1217,7 +1052,7 @@ sccmctl(dev, bits, how) break; case DMGET: - splx(s); + (void) splx(s); return (mbits); } if (line == SCC_CHANNEL_B) { @@ -1230,7 +1065,7 @@ sccmctl(dev, bits, how) } if ((mbits & DML_DTR) || (sc->scc_softCAR & (1 << line))) sc->scc_tty[line]->t_state |= TS_CARR_ON; - splx(s); + (void) splx(s); return (mbits); } @@ -1262,20 +1097,17 @@ scc_modem_intr(dev) car = value & ZSRR0_DCD; } - /* - * The pmax driver follows carrier-detect. The Alpha does not. - * XXX Why doesn't the Alpha driver follow carrier-detect? - * (in the Alpha driver, this is an "#ifdef notdef"). - * Is it related to console handling? - */ -#ifdef notdef - if (car) { - /* carrier present */ - if (!(tp->t_state & TS_CARR_ON)) - (void)(*linesw[tp->t_line].l_modem)(tp, 1); - } else if (tp->t_state & TS_CARR_ON) - (void)(*linesw[tp->t_line].l_modem)(tp, 0); + /* Break on serial console drops into the debugger */ + if ((value & ZSRR0_BREAK) && CONSOLE_ON_UNIT(sc->sc_dv.dv_unit)) { +#ifdef DDB + splx(s); /* spl0()? */ + Debugger(); + return; +#else + /* XXX maybe fall back to PROM? */ #endif + } + splx(s); } @@ -1302,9 +1134,7 @@ sccGetc(dev) if (!regs) return (0); - s = splhigh(); - for (;;) { SCC_READ_REG(regs, line, SCC_RR0, value); if (value & ZSRR0_RX_READY) { @@ -1340,7 +1170,6 @@ sccPutc(dev, c) int s; s = splhigh(); - line = SCCLINE(dev); if (cold && scc_cons_addr) { regs = scc_cons_addr; @@ -1382,7 +1211,7 @@ sccPollc(dev, on) #ifdef SCC_DEBUG void -scc_rr(msg, regs) +rr(msg, regs) char *msg; scc_regmap_t *regs; { @@ -1416,4 +1245,3 @@ scc_rr(msg, regs) r0, r1, r2, r10, r15); } #endif /* SCC_DEBUG */ -#endif /* NSCC */ |