xref: /original-bsd/sys/vax/uba/va.c (revision 2ff170e0)
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