Commit | Line | Data |
---|---|---|
7da157da | 1 | /* ct.c 4.11 82/10/17 */ |
99aa0ab4 | 2 | |
a53c8506 | 3 | #include "ct.h" |
99aa0ab4 BJ |
4 | #if NCT > 0 |
5 | /* | |
6 | * GP DR11C driver used for C/A/T | |
2b50de22 KB |
7 | * |
8 | * BUGS: | |
9 | * This driver hasn't been tested in 4.1bsd | |
99aa0ab4 BJ |
10 | */ |
11 | ||
12 | #include "../h/param.h" | |
a53c8506 | 13 | #include "../h/systm.h" |
99aa0ab4 BJ |
14 | #include "../h/tty.h" |
15 | #include "../h/pte.h" | |
16 | #include "../h/map.h" | |
99aa0ab4 BJ |
17 | #include "../h/buf.h" |
18 | #include "../h/conf.h" | |
19 | #include "../h/dir.h" | |
20 | #include "../h/user.h" | |
21 | ||
896962b1 BJ |
22 | #include "../vaxuba/ubareg.h" |
23 | #include "../vaxuba/ubavar.h" | |
24 | ||
99aa0ab4 BJ |
25 | #define PCAT (PZERO+9) |
26 | #define CATHIWAT 100 | |
27 | #define CATLOWAT 30 | |
28 | ||
a53c8506 BJ |
29 | struct ct_softc { |
30 | int sc_openf; | |
31 | struct clist sc_oq; | |
32 | } ct_softc[NCT]; | |
99aa0ab4 | 33 | |
a53c8506 BJ |
34 | struct ctdevice { |
35 | short ctcsr; | |
36 | short ctbuf; | |
99aa0ab4 BJ |
37 | }; |
38 | ||
a53c8506 BJ |
39 | int ctprobe(), ctattach(), ctintr(); |
40 | struct uba_device *ctdinfo[NCT]; | |
41 | u_short ctstd[] = { 0 }; | |
42 | struct uba_driver ctdriver = | |
43 | { ctprobe, 0, ctattach, 0, ctstd, "ct", ctdinfo }; | |
44 | ||
042f22be BJ |
45 | #define CTUNIT(dev) (minor(dev)) |
46 | ||
a53c8506 BJ |
47 | ctprobe(reg) |
48 | caddr_t reg; | |
49 | { | |
2b50de22 | 50 | register int br, cvec; /* value-result */ |
a53c8506 BJ |
51 | register struct ctdevice *ctaddr = (struct ctdevice *)reg; |
52 | ||
89b8a44c BJ |
53 | #ifdef lint |
54 | br = 0; cvec = br; br = cvec; | |
55 | ctintr(0); | |
56 | #endif | |
a53c8506 BJ |
57 | ctaddr->ctcsr = IENABLE; |
58 | DELAY(10000); | |
59 | ctaddr->ctcsr = 0; | |
9c0adba0 | 60 | return (sizeof (struct ctdevice)); |
a53c8506 | 61 | } |
99aa0ab4 | 62 | |
042f22be BJ |
63 | /*ARGSUSED*/ |
64 | ctattach(ui) | |
65 | register struct uba_device *ui; | |
66 | { | |
67 | ||
68 | } | |
69 | ||
99aa0ab4 | 70 | ctopen(dev) |
a53c8506 | 71 | dev_t dev; |
99aa0ab4 | 72 | { |
a53c8506 BJ |
73 | register struct ct_softc *sc; |
74 | register struct uba_device *ui; | |
75 | register struct ctdevice *ctaddr; | |
76 | ||
77 | if (CTUNIT(dev) >= NCT || (ui = ctdinfo[CTUNIT(dev)]) == 0 || | |
7da157da BJ |
78 | ui->ui_alive == 0 || (sc = &ct_softc[CTUNIT(dev)])->sc_openf) |
79 | return (ENXIO); | |
a53c8506 BJ |
80 | sc->sc_openf = 1; |
81 | ctaddr->ctcsr |= IENABLE; | |
7da157da | 82 | return (0); |
99aa0ab4 BJ |
83 | } |
84 | ||
a53c8506 BJ |
85 | ctclose(dev) |
86 | dev_t dev; | |
99aa0ab4 | 87 | { |
a53c8506 BJ |
88 | |
89 | ct_softc[CTUNIT(dev)].sc_openf = 0; | |
90 | ctintr(dev); | |
99aa0ab4 BJ |
91 | } |
92 | ||
406ddcbe | 93 | ctwrite(dev, uio) |
a53c8506 | 94 | dev_t dev; |
406ddcbe | 95 | struct uio *uio; |
99aa0ab4 | 96 | { |
a53c8506 BJ |
97 | register struct ct_softc *sc = &ct_softc[CTUNIT(dev)]; |
98 | register int c; | |
99aa0ab4 | 99 | |
406ddcbe | 100 | while ((c=cupass(uio)) >= 0) { |
a0eab615 | 101 | (void) spl5(); |
a53c8506 BJ |
102 | while (sc->sc_oq.c_cc > CATHIWAT) |
103 | sleep((caddr_t)&sc->sc_oq, PCAT); | |
104 | while (putc(c, &sc->sc_oq) < 0) | |
99aa0ab4 | 105 | sleep((caddr_t)&lbolt, PCAT); |
a53c8506 | 106 | ctintr(dev); |
a0eab615 | 107 | (void) spl0(); |
99aa0ab4 BJ |
108 | } |
109 | } | |
110 | ||
a53c8506 BJ |
111 | ctintr(dev) |
112 | dev_t dev; | |
99aa0ab4 BJ |
113 | { |
114 | register int c; | |
a53c8506 BJ |
115 | register struct ct_softc *sc = &ct_softc[CTUNIT(dev)]; |
116 | register struct ctdevice *ctaddr = | |
117 | (struct ctdevice *)ctdinfo[CTUNIT(dev)]->ui_addr; | |
99aa0ab4 | 118 | |
a53c8506 BJ |
119 | if (ctaddr->ctcsr&DONE) { |
120 | if ((c = getc(&sc->sc_oq)) >= 0) { | |
a53c8506 BJ |
121 | ctaddr->ctbuf = c; |
122 | if (sc->sc_oq.c_cc==0 || sc->sc_oq.c_cc==CATLOWAT) | |
123 | wakeup(&sc->sc_oq); | |
99aa0ab4 | 124 | } else { |
a53c8506 BJ |
125 | if (sc->sc_openf==0) |
126 | ctaddr->ctcsr = 0; | |
99aa0ab4 BJ |
127 | } |
128 | } | |
129 | ||
130 | } | |
131 | #endif |