|
|
1.1 ! root 1: /* ! 2: * DM-BB driver ! 3: */ ! 4: #include "../h/param.h" ! 5: #include "../h/tty.h" ! 6: #include "../h/conf.h" ! 7: #include "../h/map.h" ! 8: #include "../h/pte.h" ! 9: #include "../h/uba.h" ! 10: ! 11: #define DMADDR ((struct device *)(UBA0_DEV+0170500)) ! 12: ! 13: struct tty dh11[]; ! 14: int ndh11; /* Set by dh.c to number of lines */ ! 15: ! 16: #define DONE 0200 ! 17: #define SCENABL 040 ! 18: #define CLSCAN 01000 ! 19: #define TURNON 03 /* CD lead, line enable */ ! 20: #define RQS 04 /* request to send */ ! 21: #define TURNOFF 1 /* line enable only */ ! 22: #define CARRIER 0100 ! 23: ! 24: struct device ! 25: { ! 26: short dmcsr; ! 27: short dmlstat; ! 28: short junk[2]; ! 29: }; ! 30: ! 31: /* ! 32: * Turn on the line associated with the (DH) device dev. ! 33: */ ! 34: dmopen(dev) ! 35: { ! 36: register struct tty *tp; ! 37: register struct device *addr; ! 38: register d; ! 39: ! 40: d = minor(dev); ! 41: tp = &dh11[d]; ! 42: addr = DMADDR; ! 43: addr += d>>4; ! 44: spl5(); ! 45: addr->dmcsr = d&017; ! 46: addr->dmlstat = TURNON; ! 47: if (addr->dmlstat&CARRIER) ! 48: tp->t_state |= CARR_ON; ! 49: addr->dmcsr = IENABLE|SCENABL; ! 50: while ((tp->t_state&CARR_ON)==0) ! 51: sleep((caddr_t)&tp->t_rawq, TTIPRI); ! 52: spl0(); ! 53: } ! 54: ! 55: /* ! 56: * Dump control bits into the DM registers. ! 57: */ ! 58: dmctl(dev, bits) ! 59: { ! 60: register struct device *addr; ! 61: register d, s; ! 62: ! 63: d = minor(dev); ! 64: addr = DMADDR; ! 65: addr += d>>4; ! 66: s = spl5(); ! 67: addr->dmcsr = d&017; ! 68: addr->dmlstat = bits; ! 69: addr->dmcsr = IENABLE|SCENABL; ! 70: splx(s); ! 71: } ! 72: ! 73: /* ! 74: * DM11 interrupt. ! 75: * Mainly, deal with carrier transitions. ! 76: */ ! 77: dmint(dev) ! 78: { ! 79: register struct tty *tp; ! 80: register struct device *addr; ! 81: register d; ! 82: ! 83: d = minor(dev); ! 84: addr = DMADDR; ! 85: addr += d; ! 86: if (addr->dmcsr&DONE) { ! 87: tp = &dh11[(d<<4)+(addr->dmcsr&017)]; ! 88: if (tp < &dh11[ndh11]) { ! 89: wakeup((caddr_t)&tp->t_rawq); ! 90: if ((addr->dmlstat&CARRIER)==0) { ! 91: if ((tp->t_state&WOPEN)==0) { ! 92: signal(tp->t_pgrp, SIGHUP); ! 93: addr->dmlstat = 0; ! 94: flushtty(tp); ! 95: } ! 96: tp->t_state &= ~CARR_ON; ! 97: } else ! 98: tp->t_state |= CARR_ON; ! 99: } ! 100: addr->dmcsr = IENABLE|SCENABL; ! 101: } ! 102: } ! 103: ! 104: ! 105:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.