+ * At software clock interrupt time or after a UNIBUS reset
+ * empty all the dh silos.
+ */
+dhtimer()
+{
+ register int dh;
+ register int s = spl5();
+
+ for (dh = 0; dh < NDH; dh++)
+ dhrint(dh);
+ splx(s);
+}
+
+/*
+ * Turn on the line associated with dh dev.
+ */
+dmopen(dev)
+ dev_t dev;
+{
+ register struct tty *tp;
+ register struct dmdevice *addr;
+ register struct uba_device *ui;
+ register int unit;
+ register int dm;
+ int s;
+
+ unit = minor(dev);
+ dm = unit >> 4;
+ tp = &dh11[unit];
+ unit &= 0xf;
+ if (dm >= NDH || (ui = dminfo[dm]) == 0 || ui->ui_alive == 0 ||
+ (dhsoftCAR[dm]&(1<<unit))) {
+ tp->t_state |= TS_CARR_ON;
+ return;
+ }
+ addr = (struct dmdevice *)ui->ui_addr;
+ s = spl5();
+ addr->dmcsr &= ~DM_SE;
+ while (addr->dmcsr & DM_BUSY)
+ ;
+ addr->dmcsr = unit;
+ addr->dmlstat = DML_ON;
+ if (addr->dmlstat&DML_CAR)
+ tp->t_state |= TS_CARR_ON;
+ addr->dmcsr = DM_IE|DM_SE;
+ while ((tp->t_state&TS_CARR_ON)==0)
+ sleep((caddr_t)&tp->t_rawq, TTIPRI);
+ splx(s);
+}
+
+/*
+ * Dump control bits into the DM registers.
+ */
+dmctl(dev, bits, how)
+ dev_t dev;
+ int bits, how;
+{
+ register struct uba_device *ui;
+ register struct dmdevice *addr;
+ register int unit, s;
+ int dm;
+
+ unit = minor(dev);
+ dm = unit >> 4;
+ if ((ui = dminfo[dm]) == 0 || ui->ui_alive == 0)
+ return;
+ addr = (struct dmdevice *)ui->ui_addr;
+ s = spl5();
+ addr->dmcsr &= ~DM_SE;
+ while (addr->dmcsr & DM_BUSY)
+ ;
+ addr->dmcsr = unit & 0xf;
+ switch(how) {
+ case DMSET:
+ addr->dmlstat = bits;
+ break;
+ case DMBIS:
+ addr->dmlstat |= bits;
+ break;
+ case DMBIC:
+ addr->dmlstat &= ~bits;
+ break;
+ }
+ addr->dmcsr = DM_IE|DM_SE;
+ splx(s);
+}
+
+/*
+ * DM11 interrupt; deal with carrier transitions.