19d3b13b9Smckusick /*
2d2ef4cbcSmckusick * Copyright (c) 1982, 1986 Regents of the University of California.
39d3b13b9Smckusick * All rights reserved. The Berkeley software License Agreement
49d3b13b9Smckusick * specifies the terms and conditions for redistribution.
59d3b13b9Smckusick *
6*2ff170e0Sbostic * @(#)va.c 7.4 (Berkeley) 12/16/90
79d3b13b9Smckusick */
87e464c69Sbill
9ca430ba2Swnj #include "va.h"
1006c4b8caSbill #if NVA > 0
1106c4b8caSbill /*
121fd191a4Swnj * Varian printer plotter
1306c4b8caSbill */
14*2ff170e0Sbostic #include "../include/pte.h"
1504552eceSsam
16*2ff170e0Sbostic #include "sys/param.h"
17*2ff170e0Sbostic #include "sys/user.h"
18*2ff170e0Sbostic #include "sys/buf.h"
19*2ff170e0Sbostic #include "sys/systm.h"
20*2ff170e0Sbostic #include "sys/map.h"
21*2ff170e0Sbostic #include "sys/ioctl.h"
22*2ff170e0Sbostic #include "sys/vcmd.h"
23*2ff170e0Sbostic #include "sys/uio.h"
24*2ff170e0Sbostic #include "sys/kernel.h"
257e464c69Sbill
26cfe766c1Sbloom #include "ubareg.h"
27cfe766c1Sbloom #include "ubavar.h"
2802251208Smckusick
29296a3ed4Smckusick int vadebug = 0;
30296a3ed4Smckusick #define dprintf if(vadebug)printf
31296a3ed4Smckusick
326fa58dcaSbill unsigned minvaph();
337e464c69Sbill
347e464c69Sbill #define VAPRI (PZERO-1)
357e464c69Sbill
361fd191a4Swnj struct vadevice {
371fd191a4Swnj u_short vaba; /* buffer address */
381fd191a4Swnj short vawc; /* word count (2's complement) */
397e464c69Sbill union {
401fd191a4Swnj short Vacsw; /* control status as word */
411fd191a4Swnj struct { /* control status as bytes */
426fa58dcaSbill char Vacsl;
436fa58dcaSbill char Vacsh;
446fa58dcaSbill } vacsr;
456fa58dcaSbill } vacs;
461fd191a4Swnj short vadata; /* programmed i/o data buffer */
477e464c69Sbill };
487e464c69Sbill
496fa58dcaSbill #define vacsw vacs.Vacsw
506fa58dcaSbill #define vacsh vacs.vacsr.Vacsh
516fa58dcaSbill #define vacsl vacs.vacsr.Vacsl
526fa58dcaSbill
536fa58dcaSbill /* vacsw bits */
541fd191a4Swnj #define VA_ERROR 0100000 /* some error has occurred */
551fd191a4Swnj #define VA_NPRTIMO 0001000 /* DMA timeout error */
561fd191a4Swnj #define VA_NOTREADY 0000400 /* something besides NPRTIMO */
571fd191a4Swnj #define VA_DONE 0000200
581fd191a4Swnj #define VA_IENABLE 0000100 /* interrupt enable */
593c99c5afSmckusick #define VA_DMAGO 0000010 /* DMA go bit */
60296a3ed4Smckusick #define VA_DMAGO 0000010 /* DMA go bit */
611fd191a4Swnj #define VA_SUPPLIESLOW 0000004
621fd191a4Swnj #define VA_BOTOFFORM 0000002
631fd191a4Swnj #define VA_BYTEREVERSE 0000001 /* reverse byte order in words */
647e464c69Sbill
656fa58dcaSbill /* vacsh command bytes */
661fd191a4Swnj #define VAPLOT 0000340
671fd191a4Swnj #define VAPRINT 0000100
681fd191a4Swnj #define VAPRINTPLOT 0000160
691fd191a4Swnj #define VAAUTOSTEP 0000244
701fd191a4Swnj #define VANOAUTOSTEP 0000045
711fd191a4Swnj #define VAFORMFEED 0000263
721fd191a4Swnj #define VASLEW 0000265
731fd191a4Swnj #define VASTEP 0000064
747e464c69Sbill
751fd191a4Swnj struct va_softc {
76296a3ed4Smckusick u_char sc_openf; /* exclusive open flag */
77296a3ed4Smckusick u_char sc_iostate; /* kind of I/O going on */
78296a3ed4Smckusick #define VAS_IDLE 0 /* no I/O, free */
79296a3ed4Smckusick #define VAS_PIO 1 /* programmed I/O */
80296a3ed4Smckusick #define VAS_DMA 2 /* DMA, block pio */
81296a3ed4Smckusick #define VAS_WANT 4 /* wakeup when iostate changes */
82296a3ed4Smckusick short sc_tocnt; /* time out counter */
83296a3ed4Smckusick short sc_info; /* csw passed from vaintr */
84296a3ed4Smckusick int sc_state; /* print/plot state of device */
851fd191a4Swnj } va_softc[NVA];
867e464c69Sbill
871fd191a4Swnj #define VAUNIT(dev) (minor(dev))
881fd191a4Swnj
891fd191a4Swnj struct buf rvabuf[NVA];
901fd191a4Swnj
91296a3ed4Smckusick int vaprobe(), vaslave(), vaattach(), vadgo();
921fd191a4Swnj struct uba_device *vadinfo[NVA];
93296a3ed4Smckusick struct uba_ctlr *vaminfo[NVA];
94296a3ed4Smckusick struct buf vabhdr[NVA];
951fd191a4Swnj u_short vastd[] = { 0764000, 0 };
961fd191a4Swnj struct uba_driver vadriver =
97296a3ed4Smckusick { vaprobe, vaslave, vaattach, vadgo, vastd, "vz", vadinfo, "va", vaminfo };
981fd191a4Swnj
vaprobe(reg)991fd191a4Swnj vaprobe(reg)
1001fd191a4Swnj caddr_t reg;
1011fd191a4Swnj {
1021fd191a4Swnj register int br, cvec; /* value-result */
1031fd191a4Swnj register struct vadevice *vaaddr = (struct vadevice *)reg;
1041fd191a4Swnj
10526500764Smckusick #ifdef lint
10626500764Smckusick br = 0; cvec = br; br = cvec;
10726500764Smckusick vaintr(0);
10826500764Smckusick #endif
109296a3ed4Smckusick #ifndef UCBVAX
1101fd191a4Swnj vaaddr->vacsl = VA_IENABLE;
1111fd191a4Swnj vaaddr->vaba = 0;
1121fd191a4Swnj vaaddr->vacsh = VAPLOT;
113296a3ed4Smckusick vaaddr->vacsl = VA_IENABLE|VA_DMAGO;
1141c3f2b95Smckusick vaaddr->vawc = -1;
115296a3ed4Smckusick DELAY(10000);
1161c3f2b95Smckusick vaaddr->vacsl = 0;
117296a3ed4Smckusick vaaddr->vawc = 0;
118296a3ed4Smckusick #else
119296a3ed4Smckusick br=0x14;
120296a3ed4Smckusick cvec=0170;
121296a3ed4Smckusick #endif
1223c99c5afSmckusick return (sizeof (struct vadevice));
12326500764Smckusick }
12426500764Smckusick
12526500764Smckusick /*ARGSUSED*/
126296a3ed4Smckusick vaslave(ui, reg)
127296a3ed4Smckusick struct uba_device *ui;
128296a3ed4Smckusick caddr_t reg;
129296a3ed4Smckusick {
130296a3ed4Smckusick
131296a3ed4Smckusick ui->ui_dk = 0;
132296a3ed4Smckusick return (ui->ui_unit <= 0);
133296a3ed4Smckusick }
134296a3ed4Smckusick
135296a3ed4Smckusick /*ARGSUSED*/
1361fd191a4Swnj vaattach(ui)
1371fd191a4Swnj struct uba_device *ui;
1387e464c69Sbill {
1397e464c69Sbill
140296a3ed4Smckusick ui->ui_mi->um_tab.b_actf = &vabhdr[ui->ui_unit];
1411fd191a4Swnj }
1421fd191a4Swnj
vaopen(dev)1431fd191a4Swnj vaopen(dev)
1441fd191a4Swnj dev_t dev;
1451fd191a4Swnj {
1461fd191a4Swnj register struct va_softc *sc;
1471fd191a4Swnj register struct vadevice *vaaddr;
1481fd191a4Swnj register struct uba_device *ui;
14902251208Smckusick int error;
150296a3ed4Smckusick int unit = VAUNIT(dev);
1511fd191a4Swnj
1522905d7ddSmckusick if (unit >= NVA || (sc = &va_softc[unit])->sc_openf ||
1532905d7ddSmckusick (ui = vadinfo[unit]) == 0 || ui->ui_alive == 0)
15402251208Smckusick return (ENXIO);
1551fd191a4Swnj vaaddr = (struct vadevice *)ui->ui_addr;
1561fd191a4Swnj sc->sc_openf = 1;
1571fd191a4Swnj vaaddr->vawc = 0;
1581fd191a4Swnj sc->sc_state = 0;
159296a3ed4Smckusick sc->sc_tocnt = 0;
160296a3ed4Smckusick sc->sc_iostate = VAS_IDLE;
1611fd191a4Swnj vaaddr->vacsl = VA_IENABLE;
1621fd191a4Swnj vatimo(dev);
16302251208Smckusick error = vacmd(dev, VPRINT);
16402251208Smckusick if (error)
1651fd191a4Swnj vaclose(dev);
16602251208Smckusick return (error);
1677e464c69Sbill }
1687e464c69Sbill
vastrategy(bp)1697e464c69Sbill vastrategy(bp)
1707e464c69Sbill register struct buf *bp;
1717e464c69Sbill {
172296a3ed4Smckusick register struct uba_device *ui;
173296a3ed4Smckusick register struct uba_ctlr *um;
174296a3ed4Smckusick int s;
1757e464c69Sbill
176296a3ed4Smckusick dprintf("vastrategy(%x)\n", bp);
177296a3ed4Smckusick ui = vadinfo[VAUNIT(bp->b_dev)];
178296a3ed4Smckusick if (ui == 0 || ui->ui_alive == 0) {
17902251208Smckusick bp->b_flags |= B_ERROR;
18002251208Smckusick iodone(bp);
181296a3ed4Smckusick return;
182296a3ed4Smckusick }
183296a3ed4Smckusick s = spl4();
184296a3ed4Smckusick um = ui->ui_mi;
185296a3ed4Smckusick bp->b_actf = NULL;
186296a3ed4Smckusick if (um->um_tab.b_actf->b_actf == NULL)
187296a3ed4Smckusick um->um_tab.b_actf->b_actf = bp;
188296a3ed4Smckusick else {
189296a3ed4Smckusick printf("bp = 0x%x, um->um_tab.b_actf->b_actf = 0x%x\n",
190296a3ed4Smckusick bp, um->um_tab.b_actf->b_actf);
191296a3ed4Smckusick panic("vastrategy");
192296a3ed4Smckusick um->um_tab.b_actf->b_actl->b_forw = bp;
193296a3ed4Smckusick }
194296a3ed4Smckusick um->um_tab.b_actf->b_actl = bp;
195296a3ed4Smckusick bp = um->um_tab.b_actf;
196296a3ed4Smckusick dprintf("vastrategy: bp=%x actf=%x active=%d\n",
197296a3ed4Smckusick bp, bp->b_actf, bp->b_active);
198296a3ed4Smckusick if (bp->b_actf && bp->b_active == 0)
199296a3ed4Smckusick (void) vastart(um);
200296a3ed4Smckusick splx(s);
2017e464c69Sbill }
2027e464c69Sbill
2037e464c69Sbill int vablock = 16384;
2047e464c69Sbill
2057e464c69Sbill unsigned
minvaph(bp)2067e464c69Sbill minvaph(bp)
2077e464c69Sbill struct buf *bp;
2087e464c69Sbill {
2091fd191a4Swnj
2107e464c69Sbill if (bp->b_bcount > vablock)
2117e464c69Sbill bp->b_bcount = vablock;
2127e464c69Sbill }
2137e464c69Sbill
2147e464c69Sbill /*ARGSUSED*/
vawrite(dev,uio)2153c99c5afSmckusick vawrite(dev, uio)
2161fd191a4Swnj dev_t dev;
2173c99c5afSmckusick struct uio *uio;
2187e464c69Sbill {
21926500764Smckusick
2203c99c5afSmckusick if (VAUNIT(dev) > NVA)
22102251208Smckusick return (ENXIO);
22202251208Smckusick return (physio(vastrategy, &rvabuf[VAUNIT(dev)], dev, B_WRITE,
22302251208Smckusick minvaph, uio));
2247e464c69Sbill }
2257e464c69Sbill
vastart(um)226296a3ed4Smckusick vastart(um)
227296a3ed4Smckusick register struct uba_ctlr *um;
2287e464c69Sbill {
229296a3ed4Smckusick struct buf *bp;
230296a3ed4Smckusick struct vadevice *vaaddr;
231296a3ed4Smckusick register struct va_softc *sc;
232296a3ed4Smckusick int unit;
2337e464c69Sbill
234296a3ed4Smckusick dprintf("vastart(%x), bp=%x\n", um, um->um_tab.b_actf->b_actf);
235296a3ed4Smckusick if ((bp = um->um_tab.b_actf->b_actf) == NULL)
236296a3ed4Smckusick return;
237296a3ed4Smckusick unit = VAUNIT(bp->b_dev);
238296a3ed4Smckusick sc = &va_softc[unit];
239296a3ed4Smckusick sc->sc_tocnt = 0;
240296a3ed4Smckusick while (sc->sc_iostate&VAS_PIO) {
241296a3ed4Smckusick sc->sc_iostate |= VAS_WANT;
242296a3ed4Smckusick sleep((caddr_t)&sc->sc_iostate, VAPRI);
243296a3ed4Smckusick }
244296a3ed4Smckusick sc->sc_iostate |= VAS_DMA;
245296a3ed4Smckusick vaaddr = (struct vadevice *)um->um_addr;
246296a3ed4Smckusick vaaddr->vacsl = 0;
247296a3ed4Smckusick vaaddr->vawc = -(bp->b_bcount / 2);
248296a3ed4Smckusick um->um_cmd = VA_DMAGO | VA_IENABLE;
249296a3ed4Smckusick (void) ubago(vadinfo[unit]);
2501c3f2b95Smckusick }
2511c3f2b95Smckusick
vadgo(um)252296a3ed4Smckusick vadgo(um)
253296a3ed4Smckusick register struct uba_ctlr *um;
2541c3f2b95Smckusick {
255296a3ed4Smckusick register struct vadevice *vaaddr = (struct vadevice *)um->um_addr;
256296a3ed4Smckusick register struct buf *bp;
2571c3f2b95Smckusick
258296a3ed4Smckusick bp = um->um_tab.b_actf;
259296a3ed4Smckusick va_softc[VAUNIT(bp->b_actf->b_dev)].sc_tocnt = 0;
260296a3ed4Smckusick bp->b_active++;
261296a3ed4Smckusick vaaddr->vaba = um->um_ubinfo;
262296a3ed4Smckusick vaaddr->vacsl = ((um->um_ubinfo >> 12) & 0x30) | um->um_cmd;
2637e464c69Sbill }
2647e464c69Sbill
2657e464c69Sbill /*ARGSUSED*/
vaioctl(dev,cmd,data,flag)2663c99c5afSmckusick vaioctl(dev, cmd, data, flag)
2673c99c5afSmckusick register caddr_t data;
2687e464c69Sbill {
2691fd191a4Swnj register struct va_softc *sc = &va_softc[VAUNIT(dev)];
2707e464c69Sbill
2717e464c69Sbill switch (cmd) {
2727e464c69Sbill
2737e464c69Sbill case VGETSTATE:
2743c99c5afSmckusick *(int *)data = sc->sc_state;
27502251208Smckusick break;
2767e464c69Sbill
2777e464c69Sbill case VSETSTATE:
27802251208Smckusick return (vacmd(dev, *(int *)data));
2797e464c69Sbill
2807e464c69Sbill default:
28102251208Smckusick return (ENOTTY);
2827e464c69Sbill }
28302251208Smckusick return (0);
2847e464c69Sbill }
2857e464c69Sbill
vacmd(dev,vcmd)2861fd191a4Swnj vacmd(dev, vcmd)
2871fd191a4Swnj dev_t dev;
2881fd191a4Swnj int vcmd;
2897e464c69Sbill {
2901fd191a4Swnj register struct va_softc *sc = &va_softc[VAUNIT(dev)];
29102251208Smckusick int error = 0;
292296a3ed4Smckusick int s, cmd;
2931fd191a4Swnj
294296a3ed4Smckusick s = spl4();
295296a3ed4Smckusick while (sc->sc_iostate&VAS_DMA) {
296296a3ed4Smckusick sc->sc_iostate |= VAS_WANT;
297296a3ed4Smckusick sleep((caddr_t)&sc->sc_iostate, VAPRI);
298296a3ed4Smckusick }
299296a3ed4Smckusick sc->sc_iostate |= VAS_PIO;
300296a3ed4Smckusick sc->sc_tocnt = 0;
301296a3ed4Smckusick cmd = 0;
3027e464c69Sbill switch (vcmd) {
3037e464c69Sbill
3047e464c69Sbill case VPLOT:
3057e464c69Sbill /* Must turn on plot AND autostep modes. */
306296a3ed4Smckusick if (vadopio(dev, VAPLOT))
30702251208Smckusick error = EIO;
308296a3ed4Smckusick cmd = VAAUTOSTEP;
3097e464c69Sbill break;
3107e464c69Sbill
3117e464c69Sbill case VPRINT:
312296a3ed4Smckusick cmd = VAPRINT;
3137e464c69Sbill break;
3147e464c69Sbill
3157e464c69Sbill case VPRINTPLOT:
316296a3ed4Smckusick cmd = VAPRINTPLOT;
3177e464c69Sbill break;
3187e464c69Sbill }
3191fd191a4Swnj sc->sc_state = (sc->sc_state & ~(VPLOT|VPRINT|VPRINTPLOT)) | vcmd;
320296a3ed4Smckusick if (cmd && vadopio(dev, cmd))
32102251208Smckusick error = EIO;
322296a3ed4Smckusick sc->sc_iostate &= ~VAS_PIO;
323296a3ed4Smckusick if (sc->sc_iostate&VAS_WANT) {
324296a3ed4Smckusick sc->sc_iostate &= ~VAS_WANT;
325296a3ed4Smckusick wakeup((caddr_t)&sc->sc_iostate);
326296a3ed4Smckusick }
327296a3ed4Smckusick splx(s);
32802251208Smckusick return (error);
3297e464c69Sbill }
3307e464c69Sbill
vadopio(dev,cmd)331296a3ed4Smckusick vadopio(dev, cmd)
332296a3ed4Smckusick dev_t dev;
333296a3ed4Smckusick int cmd;
334296a3ed4Smckusick {
335296a3ed4Smckusick register struct vadevice *vaaddr =
336296a3ed4Smckusick (struct vadevice *)vaminfo[VAUNIT(dev)]->um_addr;
337296a3ed4Smckusick register struct va_softc *sc = &va_softc[VAUNIT(dev)];
338296a3ed4Smckusick
339296a3ed4Smckusick sc->sc_info = 0;
340296a3ed4Smckusick vaaddr->vacsh = cmd;
341296a3ed4Smckusick while ((sc->sc_info&(VA_DONE|VA_ERROR)) == 0)
342296a3ed4Smckusick sleep((caddr_t)&sc->sc_info, VAPRI);
343296a3ed4Smckusick return (sc->sc_info&VA_ERROR);
344296a3ed4Smckusick }
345296a3ed4Smckusick
vatimo(dev)3461fd191a4Swnj vatimo(dev)
3471fd191a4Swnj dev_t dev;
3487e464c69Sbill {
3491fd191a4Swnj register struct va_softc *sc = &va_softc[VAUNIT(dev)];
3501fd191a4Swnj
3511fd191a4Swnj if (sc->sc_openf)
352296a3ed4Smckusick timeout(vatimo, (caddr_t)dev, hz/2);
353296a3ed4Smckusick if (++sc->sc_tocnt < 2)
354296a3ed4Smckusick return;
355296a3ed4Smckusick sc->sc_tocnt = 0;
356296a3ed4Smckusick dprintf("vatimo: calling vaintr\n");
3571fd191a4Swnj vaintr(dev);
3587e464c69Sbill }
3597e464c69Sbill
3607e464c69Sbill /*ARGSUSED*/
vaintr(dev)3617e464c69Sbill vaintr(dev)
3621fd191a4Swnj dev_t dev;
3637e464c69Sbill {
364296a3ed4Smckusick register struct uba_ctlr *um;
365296a3ed4Smckusick struct vadevice *vaaddr;
366296a3ed4Smckusick struct buf *bp;
367296a3ed4Smckusick register int unit = VAUNIT(dev), e;
368296a3ed4Smckusick register struct va_softc *sc = &va_softc[unit];
3691fd191a4Swnj
370296a3ed4Smckusick um = vaminfo[unit];
371296a3ed4Smckusick vaaddr = (struct vadevice *)um->um_addr;
372296a3ed4Smckusick e = vaaddr->vacsw;
373296a3ed4Smckusick dprintf("vaintr: um=0x%x, e=0x%x, b_active %d\n",
374296a3ed4Smckusick um, e, um->um_tab.b_actf->b_active);
375296a3ed4Smckusick if ((e&(VA_DONE|VA_ERROR)) == 0)
376296a3ed4Smckusick return;
377296a3ed4Smckusick vaaddr->vacsl = 0;
378296a3ed4Smckusick if ((e&VA_ERROR) && (e&VA_NPRTIMO))
379296a3ed4Smckusick printf("va%d: npr timeout\n", unit);
380296a3ed4Smckusick if (sc->sc_iostate&VAS_PIO) {
381296a3ed4Smckusick sc->sc_info = e;
382296a3ed4Smckusick wakeup((caddr_t)&sc->sc_info);
383296a3ed4Smckusick return;
384296a3ed4Smckusick }
385296a3ed4Smckusick if (um->um_tab.b_actf->b_active) {
386296a3ed4Smckusick bp = um->um_tab.b_actf->b_actf;
387296a3ed4Smckusick if (e&VA_ERROR)
388296a3ed4Smckusick bp->b_flags |= B_ERROR;
389296a3ed4Smckusick if (sc->sc_state&VPRINTPLOT) {
390296a3ed4Smckusick sc->sc_state = (sc->sc_state & ~VPRINTPLOT) | VPLOT;
391296a3ed4Smckusick vaaddr->vacsh = VAAUTOSTEP;
392296a3ed4Smckusick return;
393296a3ed4Smckusick }
394296a3ed4Smckusick ubadone(um);
395296a3ed4Smckusick um->um_tab.b_actf->b_active = 0;
396296a3ed4Smckusick um->um_tab.b_actf->b_actf = bp->b_forw;
397296a3ed4Smckusick bp->b_active = 0;
398296a3ed4Smckusick bp->b_errcnt = 0;
399296a3ed4Smckusick bp->b_resid = 0;
400296a3ed4Smckusick iodone(bp);
401296a3ed4Smckusick }
402296a3ed4Smckusick if (um->um_tab.b_actf->b_actf == 0) {
403296a3ed4Smckusick sc->sc_iostate &= ~VAS_DMA;
404296a3ed4Smckusick if (sc->sc_iostate&VAS_WANT) {
405296a3ed4Smckusick sc->sc_iostate &= ~VAS_WANT;
406296a3ed4Smckusick wakeup((caddr_t)&sc->sc_iostate);
407296a3ed4Smckusick }
408296a3ed4Smckusick return;
409296a3ed4Smckusick }
410296a3ed4Smckusick if (um->um_tab.b_actf->b_active == 0)
411296a3ed4Smckusick vastart(um);
4127e464c69Sbill }
4137e464c69Sbill
vaclose(dev)4141fd191a4Swnj vaclose(dev)
4151fd191a4Swnj dev_t dev;
4167e464c69Sbill {
4171fd191a4Swnj register struct va_softc *sc = &va_softc[VAUNIT(dev)];
4181fd191a4Swnj register struct vadevice *vaaddr =
4191fd191a4Swnj (struct vadevice *)vadinfo[VAUNIT(dev)]->ui_addr;
4207e464c69Sbill
4211fd191a4Swnj sc->sc_openf = 0;
4221fd191a4Swnj sc->sc_state = 0;
423296a3ed4Smckusick if (sc->sc_iostate != VAS_IDLE)
424296a3ed4Smckusick wakeup((caddr_t)&sc->sc_iostate);
425296a3ed4Smckusick sc->sc_iostate = VAS_IDLE;
4261fd191a4Swnj vaaddr->vacsl = 0;
427296a3ed4Smckusick vaaddr->vawc = 0;
4287e464c69Sbill }
4296fa58dcaSbill
vareset(uban)4301fd191a4Swnj vareset(uban)
4311fd191a4Swnj int uban;
4326fa58dcaSbill {
4331fd191a4Swnj register int va11;
434296a3ed4Smckusick register struct uba_ctlr *um;
4351fd191a4Swnj register struct vadevice *vaaddr;
436296a3ed4Smckusick register struct va_softc *sc;
4376fa58dcaSbill
4381fd191a4Swnj for (va11 = 0; va11 < NVA; va11++, sc++) {
439296a3ed4Smckusick if ((um = vaminfo[va11]) == 0 || um->um_ubanum != uban ||
440296a3ed4Smckusick um->um_alive == 0)
441296a3ed4Smckusick continue;
442296a3ed4Smckusick sc = &va_softc[um->um_ctlr];
443296a3ed4Smckusick if (sc->sc_openf == 0)
4441fd191a4Swnj continue;
4451fd191a4Swnj printf(" va%d", va11);
446296a3ed4Smckusick vaaddr = (struct vadevice *)um->um_addr;
4471fd191a4Swnj vaaddr->vacsl = VA_IENABLE;
4481fd191a4Swnj if (sc->sc_state & VPLOT) {
4491fd191a4Swnj vaaddr->vacsh = VAPLOT;
4506fa58dcaSbill DELAY(10000);
4511fd191a4Swnj vaaddr->vacsh = VAAUTOSTEP;
4521fd191a4Swnj } else if (sc->sc_state & VPRINTPLOT)
4531fd191a4Swnj vaaddr->vacsh = VPRINTPLOT;
4546fa58dcaSbill else
4551fd191a4Swnj vaaddr->vacsh = VAPRINTPLOT;
4566fa58dcaSbill DELAY(10000);
4572905d7ddSmckusick sc->sc_iostate = VAS_IDLE;
4582905d7ddSmckusick um->um_tab.b_actf->b_active = 0;
4592905d7ddSmckusick um->um_tab.b_actf->b_actf = um->um_tab.b_actf->b_actl = 0;
4602905d7ddSmckusick if (um->um_ubinfo) {
4612905d7ddSmckusick printf("<%d>", (um->um_ubinfo >> 28) & 0xf);
4622905d7ddSmckusick um->um_ubinfo = 0;
4632905d7ddSmckusick }
464296a3ed4Smckusick (void) vastart(um);
4651fd191a4Swnj }
4666fa58dcaSbill }
467bc3f32ddSsam
vaselect()468bc3f32ddSsam vaselect()
469bc3f32ddSsam {
47002251208Smckusick
471bc3f32ddSsam return (1);
472bc3f32ddSsam }
47306c4b8caSbill #endif
474