|
|
1.1 root 1: /* dn.c 4.4 82/01/12 */
2:
3: #include "dn.h"
4: #if NDN > 0
5: /*
6: * DN-11 ACU interface
7: */
8:
9: #include "../h/param.h"
10: #include "../h/systm.h"
11: #include "../h/dir.h"
12: #include "../h/user.h"
13: #include "../h/buf.h"
14: #include "../h/map.h"
15: #include "../h/pte.h"
16: #include "../h/ubavar.h"
17: #include "../h/conf.h"
18: #include "../h/ioctl.h"
19:
20: struct dndevice {
21: u_short dn_reg[4];
22: };
23:
24: struct uba_device *dninfo[NDN];
25: int dnprobe(), dnattach();
26: u_short dnstd[] = { 0175200 };
27: struct uba_driver dndriver =
28: { dnprobe, 0, dnattach, 0, dnstd, "dn", dninfo };
29:
30: #define CRQ 0x001 /* call request */
31: #define DPR 0x002 /* digit present */
32: #define MENABLE 0x004 /* master enable */
33: #define MAINT 0x008 /* maintenance mode */
34: #define PND 0x010 /* present next digit */
35: #define DSS 0x020 /* data set status */
36: #define IENABLE 0x040 /* interrupt enable */
37: #define DONE 0x080 /* operation complete */
38: #define DLO 0x1000 /* data line occupied */
39: #define ACR 0x4000 /* abandon call and retry */
40: #define PWI 0x8000 /* power indicate */
41:
42: #define DNPRI (PZERO+5)
43: #define DNUNIT(dev) (minor(dev)>>2)
44: #define DNREG(dev) ((dev)&03)
45:
46: #define OBUFSIZ 40 /* largest phone # dialer can handle */
47:
48: /*
49: * There's no good way to determine the correct number of dialers attached
50: * to a single device (especially when dialers such as Vadic-821 MACS
51: * exist which can address four chassis, each with its own dialer).
52: */
53: dnprobe(reg)
54: caddr_t reg;
55: {
56: register int br, cvec; /* value-result, must be r11, r10 */
57: register struct dndevice *dnaddr = (struct dndevice *)reg;
58:
59: /*
60: * If there's at least one dialer out there it better be
61: * at chassis 0.
62: */
63: dnaddr->dn_reg[0] = MENABLE|IENABLE|DONE;
64: DELAY(5);
65: dnaddr->dn_reg[0] = 0;
66: }
67:
68: dnattach(ui)
69: struct uba_device *ui;
70: {}
71:
72: /*ARGSUSED*/
73: dnopen(dev, flag)
74: dev_t dev;
75: {
76: register struct dndevice *dp;
77: register u_short unit, *dnreg;
78: register struct uba_device *ui;
79: register short dialer;
80:
81: if ((unit = DNUNIT(dev)) >= NDN || (ui = dninfo[unit]) == 0 ||
82: ui->ui_alive == 0) {
83: u.u_error = ENXIO;
84: return;
85: }
86: dialer = DNREG(dev);
87: dp = (struct dndevice *)ui->ui_addr;
88: if (dp->dn_reg[dialer] & PWI) {
89: u.u_error = ENXIO;
90: return;
91: }
92: dnreg = &(dp->dn_reg[dialer]);
93: if (*dnreg&(DLO|CRQ)) {
94: u.u_error = EBUSY;
95: return;
96: }
97: dp->dn_reg[0] |= MENABLE;
98: *dnreg = IENABLE|MENABLE|CRQ;
99: }
100:
101: /*ARGSUSED*/
102: dnclose(dev, flag)
103: dev_t dev;
104: {
105: register struct dndevice *dp;
106:
107: dp = (struct dndevice *)dninfo[DNUNIT(dev)]->ui_addr;
108: dp->dn_reg[DNREG(dev)] = MENABLE;
109: }
110:
111: dnwrite(dev)
112: dev_t dev;
113: {
114: register u_short *dnreg;
115: register int cc;
116: register struct dndevice *dp;
117: char buf[OBUFSIZ];
118: register char *cp;
119: extern lbolt;
120:
121: dp = (struct dndevice *)dninfo[DNUNIT(dev)]->ui_addr;
122: dnreg = &(dp->dn_reg[DNREG(dev)]);
123: cc = MIN(u.u_count, OBUFSIZ);
124: cp = buf;
125: iomove(cp, (unsigned)cc, B_WRITE);
126: if (u.u_error)
127: return;
128: while ((*dnreg & (PWI|ACR|DSS)) == 0 && cc >= 0) {
129: spl4();
130: if ((*dnreg & PND) == 0 || cc == 0)
131: sleep((caddr_t)dnreg, DNPRI);
132: else switch(*cp) {
133:
134: case '-':
135: sleep((caddr_t)&lbolt, DNPRI);
136: sleep((caddr_t)&lbolt, DNPRI);
137: break;
138:
139: case 'f':
140: *dnreg &= ~CRQ;
141: sleep((caddr_t)&lbolt, DNPRI);
142: *dnreg |= CRQ;
143: break;
144:
145: case '*': case ':':
146: *cp = 012;
147: goto dial;
148:
149: case '#': case ';':
150: *cp = 013;
151: goto dial;
152:
153: case 'e': case '<':
154: *cp = 014;
155: goto dial;
156:
157: case 'w': case '=':
158: *cp = 015;
159: goto dial;
160:
161: default:
162: if (*cp < '0' || *cp > '9')
163: break;
164: dial:
165: *dnreg = (*cp << 8) | (IENABLE|MENABLE|DPR|CRQ);
166: sleep((caddr_t)dnreg, DNPRI);
167: }
168: cp++, cc--;
169: spl0();
170: }
171: if (*dnreg & (PWI|ACR))
172: u.u_error = EIO;
173: }
174:
175: dnintr(dev)
176: dev_t dev;
177: {
178: register u_short *basereg, *dnreg;
179:
180: basereg = (u_short *)dninfo[dev]->ui_addr;
181: *basereg &= ~MENABLE;
182: for (dnreg = basereg; dnreg < basereg + 4; dnreg++)
183: if (*dnreg & DONE) {
184: *dnreg &= ~(DONE|DPR);
185: wakeup((caddr_t)dnreg);
186: }
187: *basereg |= MENABLE;
188: }
189: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.