adjust hpS/RDIST upS/RDIST to 2/4 from (screwy 3/6, 6/6)
[unix-history] / usr / src / sys / vax / uba / vp.c
CommitLineData
a5cc519e 1/* vp.c 3.5 %G% */
2a75a0e9 2
a5cc519e
BJ
3#include "../conf/vp.h"
4#if NVP > 0
5/*
6 * Versatec matrix printer/plotter
7 * dma interface driver
8 */
2a75a0e9
BJ
9#include "../h/param.h"
10#include "../h/dir.h"
11#include "../h/user.h"
12#include "../h/buf.h"
13#include "../h/systm.h"
14#include "../h/map.h"
15#include "../h/pte.h"
16#include "../h/uba.h"
17
2a75a0e9
BJ
18int vpbdp = 1;
19
20unsigned minvpph();
21
22#define VPPRI (PZERO-1)
23
24struct vpregs {
25 short plbcr;
26 short fill;
27 short prbcr;
28 unsigned short pbaddr;
29 short plcsr;
30 short plbuf;
31 short prcsr;
32 unsigned short prbuf;
33};
34
2a75a0e9
BJ
35#define ERROR 0100000
36#define DTCINTR 040000
37#define DMAACT 020000
38#define READY 0200
39#define IENABLE 0100
40#define TERMCOM 040
41#define FFCOM 020
42#define EOTCOM 010
43#define CLRCOM 04
44#define RESET 02
45#define SPP 01
46
47struct {
48 int vp_state;
49 int vp_count;
50 int vp_bufp;
d62630e9 51 struct buf *vp_bp;
2a75a0e9
BJ
52} vp11;
53int vp_ubinfo;
54
55struct buf rvpbuf;
56
57#define VISOPEN 01
58#define CMNDS 076
59#define MODE 0700
60#define PRINT 0100
61#define PLOT 0200
62#define PPLOT 0400
63#define VBUSY 01000
64
65vpopen()
66{
67
68 if (vp11.vp_state & VISOPEN) {
69 u.u_error = ENXIO;
70 return;
71 }
72 vp11.vp_state = VISOPEN | PRINT | CLRCOM | RESET;
73 vp11.vp_count = 0;
74 VPADDR->prcsr = IENABLE | DTCINTR;
75 vptimo();
76 while (vp11.vp_state & CMNDS) {
81263dba 77 (void) spl4();
2a75a0e9
BJ
78 if (vperror(READY)) {
79 vpclose();
80 u.u_error = EIO;
81 return;
82 }
83 vpstart();
81263dba 84 (void) spl0();
2a75a0e9
BJ
85 }
86}
87
88vpstrategy(bp)
89 register struct buf *bp;
90{
91 register int e;
92
81263dba 93 (void) spl4();
2a75a0e9
BJ
94 while (vp11.vp_state & VBUSY)
95 sleep((caddr_t)&vp11, VPPRI);
96 vp11.vp_state |= VBUSY;
d62630e9 97 vp11.vp_bp = bp;
2a75a0e9
BJ
98 vp_ubinfo = ubasetup(bp, vpbdp);
99 vp11.vp_bufp = vp_ubinfo & 0x3ffff;
2a75a0e9
BJ
100 if (e = vperror(READY))
101 goto brkout;
102 vp11.vp_count = bp->b_bcount;
103 vpstart();
104 while ((vp11.vp_state&PLOT ? VPADDR->plcsr : VPADDR->prcsr) & DMAACT)
105 sleep((caddr_t)&vp11, VPPRI);
106 vp11.vp_count = 0;
107 vp11.vp_bufp = 0;
108 if ((vp11.vp_state&MODE) == PPLOT)
109 vp11.vp_state = (vp11.vp_state &~ MODE) | PLOT;
81263dba 110 (void) spl0();
2a75a0e9
BJ
111brkout:
112 ubafree(vp_ubinfo), vp_ubinfo = 0;
113 vp11.vp_state &= ~VBUSY;
d62630e9 114 vp11.vp_bp = 0;
2a75a0e9
BJ
115 iodone(bp);
116 if (e)
117 u.u_error = EIO;
118 wakeup((caddr_t)&vp11);
119}
120
121int vpblock = 16384;
122
123unsigned
124minvpph(bp)
125struct buf *bp;
126{
127
128 if (bp->b_bcount > vpblock)
129 bp->b_bcount = vpblock;
130}
131
132/*ARGSUSED*/
133vpwrite(dev)
134{
135
136 physio(vpstrategy, &rvpbuf, dev, B_WRITE, minvpph);
137}
138
139vperror(bit)
140{
141 register int state, e;
142
143 state = vp11.vp_state & PLOT;
144 while ((e = (state ? VPADDR->plcsr : VPADDR->prcsr) & (bit|ERROR)) == 0)
145 sleep((caddr_t)&vp11, VPPRI);
146 return (e & ERROR);
147}
148
149vpstart()
150{
151 register short bit;
152
153 if (vp11.vp_count) {
154 VPADDR->pbaddr = vp11.vp_bufp;
155 if (vp11.vp_state & (PRINT|PPLOT))
156 VPADDR->prbcr = vp11.vp_count;
157 else
158 VPADDR->plbcr = vp11.vp_count;
159 return;
160 }
161 for (bit = 1; bit != 0; bit <<= 1)
162 if (vp11.vp_state&bit&CMNDS) {
163 VPADDR->plcsr |= bit;
164 vp11.vp_state &= ~bit;
165 return;
166 }
167}
168
169/*ARGSUSED*/
170vpioctl(dev, cmd, addr, flag)
171 register caddr_t addr;
172{
173 register int m;
174
175 switch (cmd) {
176
177 case ('v'<<8)+0:
81263dba 178 (void) suword(addr, vp11.vp_state);
2a75a0e9
BJ
179 return;
180
181 case ('v'<<8)+1:
182 m = fuword(addr);
183 if (m == -1) {
184 u.u_error = EFAULT;
185 return;
186 }
187 vp11.vp_state = (vp11.vp_state & ~MODE) | (m&(MODE|CMNDS));
188 break;
189
190 default:
191 u.u_error = ENOTTY;
192 return;
193 }
81263dba
BJ
194 (void) spl4();
195 (void) vperror(READY);
2a75a0e9
BJ
196 if (vp11.vp_state&PPLOT)
197 VPADDR->plcsr |= SPP;
198 else
199 VPADDR->plcsr &= ~SPP;
200 vp11.vp_count = 0;
201 while (CMNDS & vp11.vp_state) {
81263dba 202 (void) vperror(READY);
2a75a0e9
BJ
203 vpstart();
204 }
81263dba 205 (void) spl0();
2a75a0e9
BJ
206}
207
208vptimo()
209{
210
211 if (vp11.vp_state&VISOPEN)
212 timeout(vptimo, (caddr_t)0, HZ/10);
213 vpintr(0);
214}
215
216/*ARGSUSED*/
217vpintr(dev)
218{
219
220 wakeup((caddr_t)&vp11);
221}
222
223vpclose()
224{
225
226 vp11.vp_state = 0;
227 vp11.vp_count = 0;
228 vp11.vp_bufp = 0;
229 VPADDR->plcsr = 0;
230}
d62630e9
BJ
231
232vpreset()
233{
234
235 if ((vp11.vp_state & VISOPEN) == 0)
236 return;
237 printf(" vp");
238 VPADDR->prcsr = IENABLE | DTCINTR;
239 if ((vp11.vp_state & VBUSY) == 0)
240 return;
241 if (vp_ubinfo) {
242 printf("<%d>", (vp_ubinfo>>28)&0xf);
243 ubafree(vp_ubinfo), vp_ubinfo = 0;
244 }
245 vp11.vp_bufp = vp_ubinfo & 0x3ffff;
246 vp11.vp_count = vp11.vp_bp->b_bcount;
247 vpstart();
248}
a5cc519e 249#endif