ioctl/open return errors, not u.u_error; remove ubarelses (it is
[unix-history] / usr / src / sys / vax / uba / ct.c
CommitLineData
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
29struct ct_softc {
30 int sc_openf;
31 struct clist sc_oq;
32} ct_softc[NCT];
99aa0ab4 33
a53c8506
BJ
34struct ctdevice {
35 short ctcsr;
36 short ctbuf;
99aa0ab4
BJ
37};
38
a53c8506
BJ
39int ctprobe(), ctattach(), ctintr();
40struct uba_device *ctdinfo[NCT];
41u_short ctstd[] = { 0 };
42struct uba_driver ctdriver =
43 { ctprobe, 0, ctattach, 0, ctstd, "ct", ctdinfo };
44
042f22be
BJ
45#define CTUNIT(dev) (minor(dev))
46
a53c8506
BJ
47ctprobe(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*/
64ctattach(ui)
65 register struct uba_device *ui;
66{
67
68}
69
99aa0ab4 70ctopen(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
85ctclose(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 93ctwrite(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
111ctintr(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