new kgdb stuff; use dev_t for kgdb_dev instead of cons index;
authorMike Karels <karels@ucbvax.Berkeley.EDU>
Sun, 5 May 1991 10:43:15 +0000 (02:43 -0800)
committerMike Karels <karels@ucbvax.Berkeley.EDU>
Sun, 5 May 1991 10:43:15 +0000 (02:43 -0800)
sticky tty params; new proc and calling conventions

SCCS-vsn: sys/hp/dev/dca.c 7.9
SCCS-vsn: sys/hp300/dev/dcm.c 7.11

usr/src/sys/hp/dev/dca.c
usr/src/sys/hp300/dev/dcm.c

index be317f6..37d4ac4 100644 (file)
@@ -4,7 +4,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)dca.c       7.8 (Berkeley) %G%
+ *     @(#)dca.c       7.9 (Berkeley) %G%
  */
 
 #include "dca.h"
  */
 
 #include "dca.h"
@@ -16,7 +16,7 @@
 #include "sys/systm.h"
 #include "sys/ioctl.h"
 #include "sys/tty.h"
 #include "sys/systm.h"
 #include "sys/ioctl.h"
 #include "sys/tty.h"
-#include "sys/user.h"
+#include "sys/proc.h"
 #include "sys/conf.h"
 #include "sys/file.h"
 #include "sys/uio.h"
 #include "sys/conf.h"
 #include "sys/file.h"
 #include "sys/uio.h"
@@ -25,7 +25,7 @@
 
 #include "device.h"
 #include "dcareg.h"
 
 #include "device.h"
 #include "dcareg.h"
-#include "../include/cpu.h"
+#include "machine/cpu.h"
 #include "../hp300/isr.h"
 
 int    dcaprobe();
 #include "../hp300/isr.h"
 
 int    dcaprobe();
@@ -37,8 +37,14 @@ int  dcastart(), dcaparam(), dcaintr();
 int    dcasoftCAR;
 int    dca_active;
 int    ndca = NDCA;
 int    dcasoftCAR;
 int    dca_active;
 int    ndca = NDCA;
+#ifdef DCACONSOLE
+int    dcaconsole = DCACONSOLE;
+#else
 int    dcaconsole = -1;
 int    dcaconsole = -1;
+#endif
+int    dcaconsinit;
 int    dcadefaultrate = TTYDEF_SPEED;
 int    dcadefaultrate = TTYDEF_SPEED;
+int    dcamajor;
 struct dcadevice *dca_addr[NDCA];
 struct tty dca_tty[NDCA];
 struct isr dcaisr[NDCA];
 struct dcadevice *dca_addr[NDCA];
 struct tty dca_tty[NDCA];
 struct isr dcaisr[NDCA];
@@ -65,6 +71,8 @@ struct speedtab dcaspeedtab[] = {
 
 extern struct tty *constty;
 #ifdef KGDB
 
 extern struct tty *constty;
 #ifdef KGDB
+#include "machine/remote-sl.h"
+
 extern int kgdb_dev;
 extern int kgdb_rate;
 extern int kgdb_debug_init;
 extern int kgdb_dev;
 extern int kgdb_rate;
 extern int kgdb_debug_init;
@@ -99,17 +107,18 @@ dcaprobe(hd)
        dcasoftCAR = hd->hp_flags;
        isrlink(&dcaisr[unit]);
 #ifdef KGDB
        dcasoftCAR = hd->hp_flags;
        isrlink(&dcaisr[unit]);
 #ifdef KGDB
-       if (kgdb_dev == makedev(1, unit)) {
+       if (kgdb_dev == makedev(dcamajor, unit)) {
                if (dcaconsole == unit)
                        kgdb_dev = -1;  /* can't debug over console port */
                else {
                if (dcaconsole == unit)
                        kgdb_dev = -1;  /* can't debug over console port */
                else {
-                       (void) dcainit(unit);
-                       dcaconsole = -2; /* XXX */
+                       (void) dcainit(unit, kgdb_rate);
                        if (kgdb_debug_init) {
                        if (kgdb_debug_init) {
-                               printf("dca%d: kgdb waiting...", unit);
-                               /* trap into kgdb */
-                               asm("trap #15;");
-                               printf("connected.\n");
+                               /*
+                                * Print prefix of device name,
+                                * let kgdb_connect print the rest.
+                                */
+                               printf("dca%d: ", unit);
+                               kgdb_connect(1);
                        } else
                                printf("dca%d: kgdb enabled\n", unit);
                }
                        } else
                                printf("dca%d: kgdb enabled\n", unit);
                }
@@ -117,18 +126,25 @@ dcaprobe(hd)
 #endif
        dca->dca_ic = IC_IE;
        /*
 #endif
        dca->dca_ic = IC_IE;
        /*
-        * Need to reset baud rate, etc. of next print so reset dcaconsole.
-        * Also make sure console is always "hardwired"
+        * Need to reset baud rate, etc. of next print so reset dcaconsinit.
+        * Also make sure console is always "hardwired."
         */
        if (unit == dcaconsole) {
         */
        if (unit == dcaconsole) {
-               dcaconsole = -1;
+               dcaconsinit = 0;
                dcasoftCAR |= (1 << unit);
        }
        return (1);
 }
 
                dcasoftCAR |= (1 << unit);
        }
        return (1);
 }
 
-dcaopen(dev, flag)
+/* ARGSUSED */
+#ifdef __STDC__
+dcaopen(dev_t dev, int flag, int mode, struct proc *p)
+#else
+dcaopen(dev, flag, mode, p)
        dev_t dev;
        dev_t dev;
+       int flag, mode;
+       struct proc *p;
+#endif
 {
        register struct tty *tp;
        register int unit;
 {
        register struct tty *tp;
        register int unit;
@@ -144,14 +160,16 @@ dcaopen(dev, flag)
        if ((tp->t_state & TS_ISOPEN) == 0) {
                tp->t_state |= TS_WOPEN;
                ttychars(tp);
        if ((tp->t_state & TS_ISOPEN) == 0) {
                tp->t_state |= TS_WOPEN;
                ttychars(tp);
-               tp->t_iflag = TTYDEF_IFLAG;
-               tp->t_oflag = TTYDEF_OFLAG;
-               tp->t_cflag = TTYDEF_CFLAG;
-               tp->t_lflag = TTYDEF_LFLAG;
-               tp->t_ispeed = tp->t_ospeed = dcadefaultrate;
+               if (tp->t_ispeed == 0) {
+                       tp->t_iflag = TTYDEF_IFLAG;
+                       tp->t_oflag = TTYDEF_OFLAG;
+                       tp->t_cflag = TTYDEF_CFLAG;
+                       tp->t_lflag = TTYDEF_LFLAG;
+                       tp->t_ispeed = tp->t_ospeed = dcadefaultrate;
+               }
                dcaparam(tp, &tp->t_termios);
                ttsetwater(tp);
                dcaparam(tp, &tp->t_termios);
                ttsetwater(tp);
-       } else if (tp->t_state&TS_XCLUDE && u.u_uid != 0)
+       } else if (tp->t_state&TS_XCLUDE && p->p_ucred->cr_uid != 0)
                return (EBUSY);
        (void) dcamctl(dev, MCR_DTR | MCR_RTS, DMSET);
        if ((dcasoftCAR & (1 << unit)) || (dcamctl(dev, 0, DMGET) & MSR_DCD))
                return (EBUSY);
        (void) dcamctl(dev, MCR_DTR | MCR_RTS, DMSET);
        if ((dcasoftCAR & (1 << unit)) || (dcamctl(dev, 0, DMGET) & MSR_DCD))
@@ -185,12 +203,12 @@ dcaclose(dev, flag)
        dca->dca_cfcr &= ~CFCR_SBREAK;
 #ifdef KGDB
        /* do not disable interrupts if debugging */
        dca->dca_cfcr &= ~CFCR_SBREAK;
 #ifdef KGDB
        /* do not disable interrupts if debugging */
-       if (kgdb_dev != makedev(1, unit))
+       if (dev != kgdb_dev)
 #endif
        dca->dca_ier = 0;
 #endif
        dca->dca_ier = 0;
-       if (tp->t_cflag&HUPCL || tp->t_state&TS_WOPEN || 
-           (tp->t_state&TS_ISOPEN) == 0)
-               (void) dcamctl(dev, 0, DMSET);
+       (void) dcamctl(dev, 0, DMSET);
+       if (tp->t_state & TS_HUPCLS)
+               (*linesw[tp->t_line].l_modem)(tp, 0);
        ttyclose(tp);
        return(0);
 }
        ttyclose(tp);
        return(0);
 }
@@ -243,12 +261,9 @@ dcaintr(unit)
                        code = dca->dca_data;
                        if ((tp->t_state & TS_ISOPEN) == 0) {
 #ifdef KGDB
                        code = dca->dca_data;
                        if ((tp->t_state & TS_ISOPEN) == 0) {
 #ifdef KGDB
-                               if (kgdb_dev == makedev(1, unit) &&
-                                   code == '!') {
-                                       printf("kgdb trap from dca%d\n", unit);
-                                       /* trap into kgdb */
-                                       asm("trap #15;");
-                               }
+                               if (kgdb_dev == makedev(dcamajor, unit) &&
+                                   code == FRAME_END)
+                                       kgdb_connect(0); /* trap into kgdb */
 #endif
                        } else
                                (*linesw[tp->t_line].l_rint)(code, tp);
 #endif
                        } else
                                (*linesw[tp->t_line].l_rint)(code, tp);
@@ -291,11 +306,8 @@ dcaeint(unit, dca)
 #ifdef KGDB
                /* we don't care about parity errors */
                if (((stat & (LSR_BI|LSR_FE|LSR_PE)) == LSR_PE) &&
 #ifdef KGDB
                /* we don't care about parity errors */
                if (((stat & (LSR_BI|LSR_FE|LSR_PE)) == LSR_PE) &&
-                   kgdb_dev == makedev(1, unit) && c == '!') {
-                       printf("kgdb trap from dca%d\n", unit);
-                       /* trap into kgdb */
-                       asm("trap #15;");
-               }
+                   kgdb_dev == makedev(dcamajor, unit) && c == FRAME_END)
+                       kgdb_connect(0); /* trap into kgdb */
 #endif
                return;
        }
 #endif
                return;
        }
@@ -530,7 +542,11 @@ dcacnprobe(cp)
        struct consdev *cp;
 {
        int unit, i;
        struct consdev *cp;
 {
        int unit, i;
-       extern int dcaopen();
+
+       /* locate the major number */
+       for (dcamajor = 0; dcamajor < nchrdev; dcamajor++)
+               if (cdevsw[dcamajor].d_open == dcaopen)
+                       break;
 
        /* XXX: ick */
        unit = CONUNIT;
 
        /* XXX: ick */
        unit = CONUNIT;
@@ -542,13 +558,8 @@ dcacnprobe(cp)
                return;
        }
 
                return;
        }
 
-       /* locate the major number */
-       for (i = 0; i < nchrdev; i++)
-               if (cdevsw[i].d_open == dcaopen)
-                       break;
-
        /* initialize required fields */
        /* initialize required fields */
-       cp->cn_dev = makedev(i, unit);
+       cp->cn_dev = makedev(dcamajor, unit);
        cp->cn_tp = &dca_tty[unit];
        switch (dca_addr[unit]->dca_irid) {
        case DCAID0:
        cp->cn_tp = &dca_tty[unit];
        switch (dca_addr[unit]->dca_irid) {
        case DCAID0:
@@ -563,6 +574,13 @@ dcacnprobe(cp)
                cp->cn_pri = CN_DEAD;
                break;
        }
                cp->cn_pri = CN_DEAD;
                break;
        }
+       /*
+        * If dcmconsole is initialized, raise our priority.
+        */
+       if (dcaconsole == unit)
+               cp->cn_pri = CN_REMOTE;
+       if (major(kgdb_dev) == 1)                       /* XXX */
+               kgdb_dev = makedev(dcamajor, minor(kgdb_dev));
 }
 
 dcacninit(cp)
 }
 
 dcacninit(cp)
@@ -570,15 +588,16 @@ dcacninit(cp)
 {
        int unit = UNIT(cp->cn_dev);
 
 {
        int unit = UNIT(cp->cn_dev);
 
-       dcainit(unit);
+       dcainit(unit, dcadefaultrate);
        dcaconsole = unit;
        dcaconsole = unit;
+       dcaconsinit = 1;
 }
 
 }
 
-dcainit(unit)
-       int unit;
+dcainit(unit, rate)
+       int unit, rate;
 {
        register struct dcadevice *dca;
 {
        register struct dcadevice *dca;
-       int s, rate;
+       int s;
        short stat;
 
 #ifdef lint
        short stat;
 
 #ifdef lint
@@ -590,7 +609,7 @@ dcainit(unit)
        DELAY(100);
        dca->dca_ic = IC_IE;
        dca->dca_cfcr = CFCR_DLAB;
        DELAY(100);
        dca->dca_ic = IC_IE;
        dca->dca_cfcr = CFCR_DLAB;
-       rate = ttspeedtab(dcadefaultrate, dcaspeedtab);
+       rate = ttspeedtab(rate, dcaspeedtab);
        dca->dca_data = rate & 0xFF;
        dca->dca_ier = rate >> 8;
        dca->dca_cfcr = CFCR_8BITS;
        dca->dca_data = rate & 0xFF;
        dca->dca_ier = rate >> 8;
        dca->dca_cfcr = CFCR_8BITS;
@@ -632,9 +651,12 @@ dcacnputc(dev, c)
 #ifdef lint
        stat = dev; if (stat) return;
 #endif
 #ifdef lint
        stat = dev; if (stat) return;
 #endif
-       if (dcaconsole == -1) {
-               (void) dcainit(UNIT(dev));
-               dcaconsole = UNIT(dev);
+#ifdef KGDB
+       if (dev != kgdb_dev)
+#endif
+       if (dcaconsinit == 0) {
+               (void) dcainit(UNIT(dev), dcadefaultrate);
+               dcaconsinit = 1;
        }
        /* wait for any pending transmission to finish */
        timo = 50000;
        }
        /* wait for any pending transmission to finish */
        timo = 50000;
index 6507209..fadf127 100644 (file)
  *
  * from: $Hdr: dcm.c 1.1 90/07/09$
  *
  *
  * from: $Hdr: dcm.c 1.1 90/07/09$
  *
- *     @(#)dcm.c       7.10 (Berkeley) %G%
+ *     @(#)dcm.c       7.11 (Berkeley) %G%
  */
 
 /*
  * TODO:
  *     Timeouts
  */
 
 /*
  * TODO:
  *     Timeouts
- *     Test console/kgdb support.
+ *     Test console support.
  */
 
 #include "dcm.h"
  */
 
 #include "dcm.h"
@@ -29,7 +29,7 @@
 #include "sys/systm.h"
 #include "sys/ioctl.h"
 #include "sys/tty.h"
 #include "sys/systm.h"
 #include "sys/ioctl.h"
 #include "sys/tty.h"
-#include "sys/user.h"
+#include "sys/proc.h"
 #include "sys/conf.h"
 #include "sys/file.h"
 #include "sys/uio.h"
 #include "sys/conf.h"
 #include "sys/file.h"
 #include "sys/uio.h"
@@ -39,7 +39,7 @@
 
 #include "device.h"
 #include "dcmreg.h"
 
 #include "device.h"
 #include "dcmreg.h"
-#include "../include/cpu.h"
+#include "machine/cpu.h"
 #include "../hp300/isr.h"
 
 #ifndef DEFAULT_BAUD_RATE
 #include "../hp300/isr.h"
 
 #ifndef DEFAULT_BAUD_RATE
@@ -107,15 +107,23 @@ struct    dcmischeme {
 /*
  * Console support
  */
 /*
  * Console support
  */
+#ifdef DCMCONSOLE
+int    dcmconsole = DCMCONSOLE;
+#else
 int    dcmconsole = -1;
 int    dcmconsole = -1;
+#endif
+int    dcmconsinit;
 int    dcmdefaultrate = DEFAULT_BAUD_RATE;
 int    dcmconbrdbusy = 0;
 int    dcmdefaultrate = DEFAULT_BAUD_RATE;
 int    dcmconbrdbusy = 0;
+int    dcmmajor;
 extern struct tty *constty;
 
 #ifdef KGDB
 /*
  * Kernel GDB support
  */
 extern struct tty *constty;
 
 #ifdef KGDB
 /*
  * Kernel GDB support
  */
+#include "machine/remote-sl.h"
+
 extern int kgdb_dev;
 extern int kgdb_rate;
 extern int kgdb_debug_init;
 extern int kgdb_dev;
 extern int kgdb_rate;
 extern int kgdb_debug_init;
@@ -214,21 +222,22 @@ dcmprobe(hd)
        dcmisr[brd].isr_intr = dcmintr;
        isrlink(&dcmisr[brd]);
 #ifdef KGDB
        dcmisr[brd].isr_intr = dcmintr;
        isrlink(&dcmisr[brd]);
 #ifdef KGDB
-       if (major(kgdb_dev) == 2 && BOARD(kgdb_dev) == brd) {
+       if (major(kgdb_dev) == dcmmajor && BOARD(kgdb_dev) == brd) {
                if (dcmconsole == UNIT(kgdb_dev))
                        kgdb_dev = -1;  /* can't debug over console port */
                if (dcmconsole == UNIT(kgdb_dev))
                        kgdb_dev = -1;  /* can't debug over console port */
+               /*
+                * The following could potentially be replaced
+                * by the corresponding code in dcmcnprobe.
+                */
                else {
                        (void) dcminit(kgdb_dev, kgdb_rate);
                        if (kgdb_debug_init) {
                else {
                        (void) dcminit(kgdb_dev, kgdb_rate);
                        if (kgdb_debug_init) {
-                               printf("dcm%d: kgdb waiting...",
-                                      UNIT(kgdb_dev));
-                               /* trap into kgdb */
-                               asm("trap #15;");
-                               printf("connected.\n");
+                               printf("dcm%d: ", UNIT(kgdb_dev));
+                               kgdb_connect(1);
                        } else
                        } else
-                               printf("dcm%d: kgdb enabled\n",
-                                      UNIT(kgdb_dev));
+                               printf("dcm%d: kgdb enabled\n", UNIT(kgdb_dev));
                }
                }
+               /* end could be replaced */
        }
 #endif
        if (dcmistype == DIS_TIMER)
        }
 #endif
        if (dcmistype == DIS_TIMER)
@@ -251,14 +260,21 @@ dcmprobe(hd)
         * Also make sure console is always "hardwired"
         */
        if (isconsole) {
         * Also make sure console is always "hardwired"
         */
        if (isconsole) {
-               dcmconsole = -1;
+               dcmconsinit = 0;
                dcmsoftCAR[brd] |= (1 << PORT(dcmconsole));
        }
        return (1);
 }
 
                dcmsoftCAR[brd] |= (1 << PORT(dcmconsole));
        }
        return (1);
 }
 
-dcmopen(dev, flag)
+/* ARGSUSED */
+#ifdef __STDC__
+dcmopen(dev_t dev, int flag, int mode, struct proc *p)
+#else
+dcmopen(dev, flag, mode, p)
        dev_t dev;
        dev_t dev;
+       int flag, mode;
+       struct proc *p;
+#endif
 {
        register struct tty *tp;
        register int unit, brd;
 {
        register struct tty *tp;
        register int unit, brd;
@@ -268,10 +284,6 @@ dcmopen(dev, flag)
        brd = BOARD(unit);
        if (unit >= NDCMLINE || (dcm_active & (1 << brd)) == 0)
                return (ENXIO);
        brd = BOARD(unit);
        if (unit >= NDCMLINE || (dcm_active & (1 << brd)) == 0)
                return (ENXIO);
-#ifdef KGDB
-       if (unit == UNIT(kgdb_dev))
-               return (EBUSY);
-#endif
        tp = &dcm_tty[unit];
        tp->t_oproc = dcmstart;
        tp->t_param = dcmparam;
        tp = &dcm_tty[unit];
        tp->t_oproc = dcmstart;
        tp->t_param = dcmparam;
@@ -279,19 +291,20 @@ dcmopen(dev, flag)
        if ((tp->t_state & TS_ISOPEN) == 0) {
                tp->t_state |= TS_WOPEN;
                ttychars(tp);
        if ((tp->t_state & TS_ISOPEN) == 0) {
                tp->t_state |= TS_WOPEN;
                ttychars(tp);
-               tp->t_iflag = TTYDEF_IFLAG;
-               tp->t_oflag = TTYDEF_OFLAG;
-               tp->t_cflag = TTYDEF_CFLAG;
-               tp->t_lflag = TTYDEF_LFLAG;
-               tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
+               if (tp->t_ispeed == 0) {
+                       tp->t_iflag = TTYDEF_IFLAG;
+                       tp->t_oflag = TTYDEF_OFLAG;
+                       tp->t_cflag = TTYDEF_CFLAG;
+                       tp->t_lflag = TTYDEF_LFLAG;
+                       tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
+               }
                (void) dcmparam(tp, &tp->t_termios);
                ttsetwater(tp);
                (void) dcmparam(tp, &tp->t_termios);
                ttsetwater(tp);
-       } else if (tp->t_state&TS_XCLUDE && u.u_uid != 0)
+       } else if (tp->t_state&TS_XCLUDE && p->p_ucred->cr_uid != 0)
                return (EBUSY);
        (void) dcmmctl(dev, MO_ON, DMSET);      /* enable port */
                return (EBUSY);
        (void) dcmmctl(dev, MO_ON, DMSET);      /* enable port */
-       if (dcmsoftCAR[brd] & (1 << PORT(unit)))
-               tp->t_state |= TS_CARR_ON;
-       else if (dcmmctl(dev, MO_OFF, DMGET) & MI_CD)
+       if ((dcmsoftCAR[brd] & (1 << PORT(unit))) ||
+           (dcmmctl(dev, MO_OFF, DMGET) & MI_CD))
                tp->t_state |= TS_CARR_ON;
 #ifdef DEBUG
        if (dcmdebug & DDB_MODEM)
                tp->t_state |= TS_CARR_ON;
 #ifdef DEBUG
        if (dcmdebug & DDB_MODEM)
@@ -328,9 +341,12 @@ dcmclose(dev, flag)
        unit = UNIT(dev);
        tp = &dcm_tty[unit];
        (*linesw[tp->t_line].l_close)(tp);
        unit = UNIT(dev);
        tp = &dcm_tty[unit];
        (*linesw[tp->t_line].l_close)(tp);
-       if (tp->t_cflag&HUPCL || tp->t_state&TS_WOPEN || 
-           (tp->t_state&TS_ISOPEN) == 0)
-               (void) dcmmctl(dev, MO_OFF, DMSET);
+#ifdef KGDB
+       if (dev != kgdb_dev)
+#endif
+       (void) dcmmctl(dev, MO_OFF, DMSET);
+       if (tp->t_state & TS_HUPCLS)
+               (*linesw[tp->t_line].l_modem)(tp, 0);
 #ifdef DEBUG
        if (dcmdebug & DDB_OPENCLOSE)
                printf("dcmclose: u %x st %x fl %x\n",
 #ifdef DEBUG
        if (dcmdebug & DDB_OPENCLOSE)
                printf("dcmclose: u %x st %x fl %x\n",
@@ -516,16 +532,14 @@ dcmreadbuf(unit, dcm, tp)
 #endif
        if ((tp->t_state & TS_ISOPEN) == 0) {
 #ifdef KGDB
 #endif
        if ((tp->t_state & TS_ISOPEN) == 0) {
 #ifdef KGDB
-               if (unit == UNIT(kgdb_dev) &&
+               if ((makedev(dcmmajor, unit) == kgdb_dev) &&
                    (head = pp->r_head & RX_MASK) != (pp->r_tail & RX_MASK) &&
                    (head = pp->r_head & RX_MASK) != (pp->r_tail & RX_MASK) &&
-                   dcm->dcm_rfifos[3-port][head>>1].data_char == '!') {
+                   dcm->dcm_rfifos[3-port][head>>1].data_char == FRAME_END) {
                        pp->r_head = (head + 2) & RX_MASK;
                        pp->r_head = (head + 2) & RX_MASK;
-                       printf("kgdb trap from dcm%d\n", unit);
-                       /* trap into kgdb */
-                       asm("trap #15;");
+                       kgdb_connect(0);        /* trap into kgdb */
                        return;
                }
                        return;
                }
-#endif
+#endif /* KGDB */
                pp->r_head = pp->r_tail & RX_MASK;
                return;
        }
                pp->r_head = pp->r_tail & RX_MASK;
                return;
        }
@@ -593,10 +607,7 @@ dcmxint(unit, dcm, tp)
        tp->t_state &= ~TS_BUSY;
        if (tp->t_state & TS_FLUSH)
                tp->t_state &= ~TS_FLUSH;
        tp->t_state &= ~TS_BUSY;
        if (tp->t_state & TS_FLUSH)
                tp->t_state &= ~TS_FLUSH;
-       if (tp->t_line)
-               (*linesw[tp->t_line].l_start)(tp);
-       else
-               dcmstart(tp);
+       (*linesw[tp->t_line].l_start)(tp);
 }
 
 dcmmint(unit, mcnd, dcm)
 }
 
 dcmmint(unit, mcnd, dcm)
@@ -615,6 +626,14 @@ dcmmint(unit, mcnd, dcm)
        tp = &dcm_tty[unit];
        delta = mcnd ^ mcndlast[unit];
        mcndlast[unit] = mcnd;
        tp = &dcm_tty[unit];
        delta = mcnd ^ mcndlast[unit];
        mcndlast[unit] = mcnd;
+       if ((delta & MI_CTS) && (tp->t_state & TS_ISOPEN) &&
+           (tp->t_flags & CRTSCTS)) {
+               if (mcnd & MI_CTS) {
+                       tp->t_state &= ~TS_TTSTOP;
+                       ttstart(tp);
+               } else
+                       tp->t_state |= TS_TTSTOP;       /* inline dcmstop */
+       }
        if ((delta & MI_CD) &&
            (dcmsoftCAR[BOARD(unit)] & (1 << PORT(unit))) == 0) {
                if (mcnd & MI_CD)
        if ((delta & MI_CD) &&
            (dcmsoftCAR[BOARD(unit)] & (1 << PORT(unit))) == 0) {
                if (mcnd & MI_CD)
@@ -627,13 +646,6 @@ dcmmint(unit, mcnd, dcm)
                        SEM_UNLOCK(dcm);
                        DELAY(10); /* time to change lines */
                }
                        SEM_UNLOCK(dcm);
                        DELAY(10); /* time to change lines */
                }
-       } else if ((delta & MI_CTS) &&
-                  (tp->t_state & TS_ISOPEN) && (tp->t_flags & CRTSCTS)) {
-               if (mcnd & MI_CTS) {
-                       tp->t_state &= ~TS_TTSTOP;
-                       ttstart(tp);
-               } else
-                       tp->t_state |= TS_TTSTOP;       /* inline dcmstop */
        }
 }
 
        }
 }
 
@@ -779,7 +791,7 @@ dcmparam(tp, t)
        dcm->dcm_cr |= (1 << port);
        SEM_UNLOCK(dcm);
        /*
        dcm->dcm_cr |= (1 << port);
        SEM_UNLOCK(dcm);
        /*
-        * Delay for config change to take place. Weighted by buad.
+        * Delay for config change to take place. Weighted by baud.
         * XXX why do we do this?
         */
        DELAY(16 * DCM_USPERCH(tp->t_ospeed));
         * XXX why do we do this?
         */
        DELAY(16 * DCM_USPERCH(tp->t_ospeed));
@@ -883,6 +895,7 @@ again:
                head = pp->t_head & TX_MASK;
                goto again;
        }
                head = pp->t_head & TX_MASK;
                goto again;
        }
+
        /*
         * Kick it one last time in case it finished while we were
         * loading the last bunch.
        /*
         * Kick it one last time in case it finished while we were
         * loading the last bunch.
@@ -1051,8 +1064,12 @@ dcmcnprobe(cp)
        struct consdev *cp;
 {
        register struct hp_hw *hw;
        struct consdev *cp;
 {
        register struct hp_hw *hw;
-       int unit, i;
-       extern int dcmopen();
+       int unit;
+
+       /* locate the major number */
+       for (dcmmajor = 0; dcmmajor < nchrdev; dcmmajor++)
+               if (cdevsw[dcmmajor].d_open == dcmopen)
+                       break;
 
        /*
         * Implicitly assigns the lowest select code DCM card found to be
 
        /*
         * Implicitly assigns the lowest select code DCM card found to be
@@ -1069,13 +1086,8 @@ dcmcnprobe(cp)
        unit = CONUNIT;
        dcm_addr[BOARD(CONUNIT)] = (struct dcmdevice *)hw->hw_addr;
 
        unit = CONUNIT;
        dcm_addr[BOARD(CONUNIT)] = (struct dcmdevice *)hw->hw_addr;
 
-       /* locate the major number */
-       for (i = 0; i < nchrdev; i++)
-               if (cdevsw[i].d_open == dcmopen)
-                       break;
-
        /* initialize required fields */
        /* initialize required fields */
-       cp->cn_dev = makedev(i, unit);
+       cp->cn_dev = makedev(dcmmajor, unit);
        cp->cn_tp = &dcm_tty[unit];
        switch (dcm_addr[BOARD(unit)]->dcm_rsid) {
        case DCMID:
        cp->cn_tp = &dcm_tty[unit];
        switch (dcm_addr[BOARD(unit)]->dcm_rsid) {
        case DCMID:
@@ -1086,14 +1098,43 @@ dcmcnprobe(cp)
                break;
        default:
                cp->cn_pri = CN_DEAD;
                break;
        default:
                cp->cn_pri = CN_DEAD;
-               break;
+               return;
        }
        }
+       /*
+        * If dcmconsole is initialized, raise our priority.
+        */
+       if (dcmconsole == UNIT(unit))
+               cp->cn_pri = CN_REMOTE;
+#ifdef KGDB
+       if (major(kgdb_dev) == 2)                       /* XXX */
+               kgdb_dev = makedev(dcmmajor, minor(kgdb_dev));
+#ifdef notdef
+       /*
+        * This doesn't currently work, at least not with ite consoles;
+        * the console hasn't been initialized yet.
+        */
+       if (major(kgdb_dev) == dcmmajor && BOARD(kgdb_dev) == BOARD(unit)) {
+               (void) dcminit(kgdb_dev, kgdb_rate);
+               if (kgdb_debug_init) {
+                       /*
+                        * We assume that console is ready for us...
+                        * this assumes that a dca or ite console
+                        * has been selected already and will init
+                        * on the first putc.
+                        */
+                       printf("dcm%d: ", UNIT(kgdb_dev));
+                       kgdb_connect(1);
+               }
+       }
+#endif
+#endif
 }
 
 dcmcninit(cp)
        struct consdev *cp;
 {
        dcminit(cp->cn_dev, dcmdefaultrate);
 }
 
 dcmcninit(cp)
        struct consdev *cp;
 {
        dcminit(cp->cn_dev, dcmdefaultrate);
+       dcmconsinit = 1;
        dcmconsole = UNIT(cp->cn_dev);
 }
 
        dcmconsole = UNIT(cp->cn_dev);
 }
 
@@ -1122,7 +1163,7 @@ dcminit(dev, rate)
        dcm->dcm_cr |= (1 << port);
        SEM_UNLOCK(dcm);
        /*
        dcm->dcm_cr |= (1 << port);
        SEM_UNLOCK(dcm);
        /*
-        * Delay for config change to take place. Weighted by buad.
+        * Delay for config change to take place. Weighted by baud.
         * XXX why do we do this?
         */
        DELAY(16 * DCM_USPERCH(rate));
         * XXX why do we do this?
         */
        DELAY(16 * DCM_USPERCH(rate));
@@ -1179,9 +1220,9 @@ dcmcnputc(dev, c)
 #ifdef KGDB
        if (dev != kgdb_dev)
 #endif
 #ifdef KGDB
        if (dev != kgdb_dev)
 #endif
-       if (dcmconsole == -1) {
+       if (dcmconsinit == 0) {
                (void) dcminit(dev, dcmdefaultrate);
                (void) dcminit(dev, dcmdefaultrate);
-               dcmconsole = UNIT(dev);
+               dcmconsinit = 1;
        }
        tail = pp->t_tail & TX_MASK;
        while (tail != (pp->t_head & TX_MASK))
        }
        tail = pp->t_tail & TX_MASK;
        while (tail != (pp->t_head & TX_MASK))