|
|
1.1 ! root 1: /* ! 2: * DN-11 ACU interface ! 3: * Minor devices < <128 are standard 801's ! 4: * Minor devices >= 128 are Parker shared ! 5: * units in which the 1st digit selects a line. ! 6: * The only interface difference is that DLO ! 7: * can appear some time after the line is selected ! 8: * to indicate that the line is busy or out of service. ! 9: * ! 10: * If the system has an accessible DR-11C, allow some of ! 11: * its bits to be fiddled. ! 12: */ ! 13: ! 14: #include "sys/param.h" ! 15: #include "sys/user.h" ! 16: #include "sys/conf.h" ! 17: #include "sys/ubaddr.h" ! 18: ! 19: struct device { ! 20: u_short dn_reg[4]; ! 21: }; ! 22: ! 23: #define PWI 0100000 ! 24: #define ACR 040000 ! 25: #define DLO 010000 ! 26: #define DONE 0200 ! 27: #define IENABLE 0100 ! 28: #define DSS 040 ! 29: #define PND 020 ! 30: #define MAINT 010 ! 31: #define MENABLE 04 ! 32: #define DPR 02 ! 33: #define CRQ 01 ! 34: ! 35: #define DNPRI (PZERO+5) ! 36: ! 37: extern int dncnt; ! 38: extern struct ubaddr dnaddr[]; ! 39: extern caddr_t dnreg[]; ! 40: ! 41: static int dnindex(); ! 42: ! 43: int dnopen(), dnclose(), dnwrite(); ! 44: struct cdevsw dncdev = cdinit(dnopen, dnclose, nodev, dnwrite, nodev); ! 45: ! 46: dnopen(dev) ! 47: register dev; ! 48: { ! 49: register struct device *dp; ! 50: register unit; ! 51: ! 52: dev = minor(dev) & 0177; ! 53: unit = dev>>2; ! 54: if (unit > dncnt) { ! 55: u.u_error = ENXIO; ! 56: return; ! 57: } ! 58: if ((dp = (struct device *)dnreg[unit]) == NULL) { ! 59: if ((dp = (struct device *)ubaddr(&dnaddr[unit])) == NULL ! 60: || ubbadaddr(dnaddr[unit].ubno, &dp->dn_reg[0], sizeof(short))) { ! 61: printf("dn%d absent\n", unit); ! 62: u.u_error = ENXIO; ! 63: return; ! 64: } ! 65: dnreg[unit] = (caddr_t)dp; ! 66: } ! 67: if (dp->dn_reg[dev&03]&(PWI|DLO|CRQ)) { ! 68: u.u_error = ENXIO; ! 69: return; ! 70: } ! 71: dp->dn_reg[0] |= MENABLE; ! 72: dp->dn_reg[dev&03] = IENABLE|MENABLE|CRQ; ! 73: } ! 74: ! 75: dnclose(dev) ! 76: { ! 77: dev = minor(dev) & 0177; ! 78: ((struct device *)dnreg[dev>>2])->dn_reg[dev&03] = MENABLE; ! 79: } ! 80: ! 81: dnwrite(dev) ! 82: { ! 83: register c; ! 84: register u_short *dp; ! 85: register first; ! 86: extern lbolt; ! 87: int ldlo; ! 88: register int setspeed = -1; ! 89: register k; ! 90: ! 91: ldlo = 0; ! 92: if (dev & 0200) ! 93: ldlo = DLO; ! 94: dev = minor(dev) & 0177; ! 95: dp = &((struct device *)dnreg[dev>>2])->dn_reg[dev&03]; ! 96: if (*dp & DLO) { ! 97: u.u_error = EIO; ! 98: return; ! 99: } ! 100: *dp |= CRQ; ! 101: first = 0; ! 102: while ((*dp & (PWI|ACR|DSS|ldlo)) == 0) { ! 103: spl4(); ! 104: if ((*dp&PND) == 0 || u.u_count == 0 || (c=cpass()) < 0) ! 105: sleep((caddr_t)dp, DNPRI); ! 106: else if (c == '-') { ! 107: sleep((caddr_t)&lbolt, DNPRI); ! 108: sleep((caddr_t)&lbolt, DNPRI); ! 109: } else if ((k = dnindex (c, "abcdefghABCDEFGH")) >= 0) { ! 110: setspeed = k; ! 111: } else { ! 112: *dp = (c<<8)|IENABLE|MENABLE|DPR|CRQ; ! 113: if (first == 0) { ! 114: while (first < 800) ! 115: first++; ! 116: if (*dp&ldlo) { ! 117: *dp = MENABLE; ! 118: break; ! 119: } ! 120: ldlo = 0; ! 121: } ! 122: sleep((caddr_t)dp, DNPRI); ! 123: } ! 124: spl0(); ! 125: } ! 126: if (*dp&(PWI|ACR|ldlo)) ! 127: u.u_error = EIO; ! 128: else if (setspeed >= 0) ! 129: drsetbit (setspeed % 8, setspeed / 8); ! 130: } ! 131: ! 132: /* ! 133: * interrupt-- "dev" is ! 134: * system unit number, not minor device ! 135: */ ! 136: dn0int(dev) ! 137: { ! 138: register u_short *ep; ! 139: register struct device *dp; ! 140: ! 141: dp = (struct device *)dnreg[dev]; ! 142: dp->dn_reg[0] &= ~MENABLE; ! 143: for (ep = &dp->dn_reg[0]; ep < &dp->dn_reg[4]; ep++) ! 144: if (*ep&DONE) { ! 145: *ep &= ~DONE; ! 146: wakeup((caddr_t)ep); ! 147: } ! 148: dp->dn_reg[0] |= MENABLE; ! 149: } ! 150: ! 151: static int ! 152: dnindex (c, s) ! 153: register char c, *s; ! 154: { ! 155: register char *p; ! 156: ! 157: p = s; ! 158: while (*p) { ! 159: if (c == *p) ! 160: return p - s; ! 161: p++; ! 162: } ! 163: return -1; ! 164: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.