|
|
1.1 root 1: /*
2: * Vax console driver
3: */
4: #include "../h/param.h"
5: #include "../h/inode.h"
6: #include "../h/stream.h"
7: #include "../h/ioctl.h"
8: #include "../h/ttyld.h"
9: #include "../h/cons.h"
10: #include "../h/mtpr.h"
11: #include "../h/conf.h"
12: #include "../h/cpu.h"
13:
14: #define BUSY 02
15: #define TIMEOUT 04
16:
17: short cnstate;
18: struct queue *cnrq;
19: struct queue *cnwq;
20:
21: int cnopen(), cnclose(), cnoput(), nodev();
22:
23: static struct qinit cnrinit = { nodev, NULL, cnopen, cnclose, 0, 0 };
24: static struct qinit cnwinit = { cnoput, NULL, cnopen, cnclose, 200, 100 };
25: struct streamtab cninfo = { &cnrinit, &cnwinit };
26:
27: cnopen(qp, dev)
28: register struct queue *qp;
29: {
30: cnrq = qp;
31: cnwq = WR(qp);
32: mtpr(RXCS, mfpr(RXCS)|RXCS_IE);
33: mtpr(TXCS, mfpr(TXCS)|TXCS_IE);
34: return(1);
35: }
36:
37: cnclose(qp)
38: {
39: cnrq = NULL;
40: cnwq = NULL;
41: }
42:
43: /*
44: * Console write put routine
45: */
46: cnoput(q, bp)
47: register struct queue *q;
48: register struct block *bp;
49: {
50:
51: switch(bp->type) {
52:
53: case M_IOCTL: /* just acknowledge */
54: switch (((union stmsg *)bp->rptr)->ioc0.com) {
55:
56: case TIOCSETP:
57: case TIOCSETN:
58: bp->wptr = bp->rptr;
59: case TIOCGETP:
60: bp->type = M_IOCACK;
61: qreply(q, bp);
62: return;
63:
64: default:
65: bp->type = M_IOCNAK;
66: bp->wptr = bp->rptr;
67: qreply(q, bp);
68: return;
69: }
70:
71: case M_STOP:
72: cnstate |= TTSTOP;
73: break;
74:
75: case M_START:
76: cnstate &= ~TTSTOP;
77: cnstart();
78: break;
79:
80: case M_FLUSH:
81: flushq(q, 0);
82: break;
83:
84: case M_DELAY:
85: case M_DATA:
86: putq(q, bp);
87: cnstart();
88: return;
89:
90: default: /* not handled; just toss */
91: break;
92: }
93: freeb(bp);
94: }
95:
96: /*
97: * Console receive interrupt
98: */
99: /*ARGSUSED*/
100: cnrint(dev)
101: {
102: register int c;
103:
104: c = mfpr(RXDB);
105: #if VAX780
106: if (c & RXDB_ID && cpu == VAX_780)
107: cnrfl (c);
108: #endif
109: if (c&RXDB_ID || cnrq==NULL)
110: return;
111: if ((cnrq->next->flag & QFULL) == 0)
112: putd(cnrq->next->qinfo->putp, cnrq->next, c);
113: }
114:
115:
116: /*
117: * Transmitter interrupt
118: */
119: /*ARGSUSED*/
120: cnxint(dev)
121: {
122: cnstate &= ~BUSY;
123: cnstart();
124: #if VAX780
125: /* if the console wasn't started, try the floppy */
126: if (cpu==VAX_780 && (cnstate & BUSY) == 0)
127: conxfl();
128: #endif
129: }
130:
131: cntime()
132: {
133: cnstate &= ~TIMEOUT;
134: cnstart();
135: }
136:
137: cnstart()
138: {
139: register s;
140: register struct block *bp;
141:
142: if (cnwq==NULL)
143: return;
144: s = spl6();
145: if ((cnstate & (TIMEOUT|BUSY|TTSTOP))==0 && cnwq->count) {
146: bp = getq(cnwq);
147: switch (bp->type) {
148:
149: case M_DATA:
150: mtpr(TXDB, *bp->rptr++);
151: cnstate |= BUSY;
152: if (bp->rptr >= bp->wptr)
153: freeb(bp);
154: else
155: putbq(cnwq, bp);
156: break;
157:
158: case M_DELAY:
159: timeout(cntime, (caddr_t)NULL, (int)*bp->rptr);
160: cnstate |= TIMEOUT;
161: default: /* flow through */
162: freeb(bp);
163: break;
164: }
165: }
166: splx(s);
167: }
168:
169: /*
170: * Print a character on console.
171: * Attempts to save and restore device
172: * status.
173: */
174: cnputc(c)
175: register c;
176: {
177: register s, timo;
178:
179: timo = 30000;
180: /*
181: * Try waiting for the console tty to come ready,
182: * otherwise give up after a reasonable time.
183: */
184: while((mfpr(TXCS)&TXCS_RDY) == 0)
185: if(--timo == 0)
186: break;
187: if(c == 0)
188: return;
189: s = mfpr(TXCS);
190: mtpr(TXCS, 0);
191: mtpr(TXDB, c&0xff);
192: if(c == '\n')
193: cnputc('\r');
194: cnputc(0);
195: mtpr(TXCS, s);
196: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.