summaryrefslogtreecommitdiff
path: root/sys/arch/alpha/tc/scc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/alpha/tc/scc.c')
-rw-r--r--sys/arch/alpha/tc/scc.c352
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 */