xref: /original-bsd/sys/vax/uba/va.c (revision 9d3b13b9)
1*9d3b13b9Smckusick /*
2*9d3b13b9Smckusick  * Copyright (c) 1982 Regents of the University of California.
3*9d3b13b9Smckusick  * All rights reserved.  The Berkeley software License Agreement
4*9d3b13b9Smckusick  * specifies the terms and conditions for redistribution.
5*9d3b13b9Smckusick  *
6*9d3b13b9Smckusick  *	@(#)va.c	6.3 (Berkeley) 06/08/85
7*9d3b13b9Smckusick  */
87e464c69Sbill 
9ca430ba2Swnj #include "va.h"
1006c4b8caSbill #if NVA > 0
1106c4b8caSbill /*
121fd191a4Swnj  * Varian printer plotter
1306c4b8caSbill  */
1404552eceSsam #include "../machine/pte.h"
1504552eceSsam 
16cfe766c1Sbloom #include "param.h"
17cfe766c1Sbloom #include "dir.h"
18cfe766c1Sbloom #include "user.h"
19cfe766c1Sbloom #include "buf.h"
20cfe766c1Sbloom #include "systm.h"
21cfe766c1Sbloom #include "map.h"
22cfe766c1Sbloom #include "ioctl.h"
23cfe766c1Sbloom #include "vcmd.h"
24cfe766c1Sbloom #include "uio.h"
25cfe766c1Sbloom #include "kernel.h"
267e464c69Sbill 
27cfe766c1Sbloom #include "ubareg.h"
28cfe766c1Sbloom #include "ubavar.h"
2902251208Smckusick 
30296a3ed4Smckusick int	vadebug = 0;
31296a3ed4Smckusick #define	dprintf	if(vadebug)printf
32296a3ed4Smckusick 
336fa58dcaSbill unsigned minvaph();
347e464c69Sbill 
357e464c69Sbill #define	VAPRI	(PZERO-1)
367e464c69Sbill 
371fd191a4Swnj struct	vadevice {
381fd191a4Swnj 	u_short	vaba;			/* buffer address */
391fd191a4Swnj 	short	vawc;			/* word count (2's complement) */
407e464c69Sbill 	union {
411fd191a4Swnj 		short	Vacsw;		/* control status as word */
421fd191a4Swnj 		struct {		/* control status as bytes */
436fa58dcaSbill 			char Vacsl;
446fa58dcaSbill 			char Vacsh;
456fa58dcaSbill 		} vacsr;
466fa58dcaSbill 	} vacs;
471fd191a4Swnj 	short	vadata;			/* programmed i/o data buffer */
487e464c69Sbill };
497e464c69Sbill 
506fa58dcaSbill #define	vacsw	vacs.Vacsw
516fa58dcaSbill #define	vacsh	vacs.vacsr.Vacsh
526fa58dcaSbill #define	vacsl	vacs.vacsr.Vacsl
536fa58dcaSbill 
546fa58dcaSbill /* vacsw bits */
551fd191a4Swnj #define	VA_ERROR	0100000		/* some error has occurred */
561fd191a4Swnj #define	VA_NPRTIMO	0001000		/* DMA timeout error */
571fd191a4Swnj #define	VA_NOTREADY	0000400		/* something besides NPRTIMO */
581fd191a4Swnj #define	VA_DONE		0000200
591fd191a4Swnj #define	VA_IENABLE	0000100		/* interrupt enable */
603c99c5afSmckusick #define	VA_DMAGO	0000010		/* DMA go bit */
61296a3ed4Smckusick #define	VA_DMAGO	0000010		/* DMA go bit */
621fd191a4Swnj #define	VA_SUPPLIESLOW	0000004
631fd191a4Swnj #define	VA_BOTOFFORM	0000002
641fd191a4Swnj #define	VA_BYTEREVERSE	0000001		/* reverse byte order in words */
657e464c69Sbill 
666fa58dcaSbill /* vacsh command bytes */
671fd191a4Swnj #define	VAPLOT		0000340
681fd191a4Swnj #define	VAPRINT		0000100
691fd191a4Swnj #define	VAPRINTPLOT	0000160
701fd191a4Swnj #define	VAAUTOSTEP	0000244
711fd191a4Swnj #define	VANOAUTOSTEP	0000045
721fd191a4Swnj #define	VAFORMFEED	0000263
731fd191a4Swnj #define	VASLEW		0000265
741fd191a4Swnj #define	VASTEP		0000064
757e464c69Sbill 
761fd191a4Swnj struct va_softc {
77296a3ed4Smckusick 	u_char	sc_openf;		/* exclusive open flag */
78296a3ed4Smckusick 	u_char	sc_iostate;		/* kind of I/O going on */
79296a3ed4Smckusick #define	VAS_IDLE	0	/* no I/O, free */
80296a3ed4Smckusick #define	VAS_PIO		1	/* programmed I/O */
81296a3ed4Smckusick #define	VAS_DMA		2	/* DMA, block pio */
82296a3ed4Smckusick #define	VAS_WANT	4	/* wakeup when iostate changes */
83296a3ed4Smckusick 	short	sc_tocnt;		/* time out counter */
84296a3ed4Smckusick 	short	sc_info;		/* csw passed from vaintr */
85296a3ed4Smckusick 	int	sc_state;		/* print/plot state of device */
861fd191a4Swnj } va_softc[NVA];
877e464c69Sbill 
881fd191a4Swnj #define	VAUNIT(dev)	(minor(dev))
891fd191a4Swnj 
901fd191a4Swnj struct	buf rvabuf[NVA];
911fd191a4Swnj 
92296a3ed4Smckusick int	vaprobe(), vaslave(), vaattach(), vadgo();
931fd191a4Swnj struct	uba_device *vadinfo[NVA];
94296a3ed4Smckusick struct	uba_ctlr *vaminfo[NVA];
95296a3ed4Smckusick struct	buf vabhdr[NVA];
961fd191a4Swnj u_short	vastd[] = { 0764000, 0 };
971fd191a4Swnj struct	uba_driver vadriver =
98296a3ed4Smckusick     { vaprobe, vaslave, vaattach, vadgo, vastd, "vz", vadinfo, "va", vaminfo };
991fd191a4Swnj 
1001fd191a4Swnj vaprobe(reg)
1011fd191a4Swnj 	caddr_t reg;
1021fd191a4Swnj {
1031fd191a4Swnj 	register int br, cvec;		/* value-result */
1041fd191a4Swnj 	register struct vadevice *vaaddr = (struct vadevice *)reg;
1051fd191a4Swnj 
10626500764Smckusick #ifdef lint
10726500764Smckusick 	br = 0; cvec = br; br = cvec;
10826500764Smckusick 	vaintr(0);
10926500764Smckusick #endif
110296a3ed4Smckusick #ifndef UCBVAX
1111fd191a4Swnj 	vaaddr->vacsl = VA_IENABLE;
1121fd191a4Swnj 	vaaddr->vaba = 0;
1131fd191a4Swnj 	vaaddr->vacsh = VAPLOT;
114296a3ed4Smckusick 	vaaddr->vacsl = VA_IENABLE|VA_DMAGO;
1151c3f2b95Smckusick 	vaaddr->vawc = -1;
116296a3ed4Smckusick 	DELAY(10000);
1171c3f2b95Smckusick 	vaaddr->vacsl = 0;
118296a3ed4Smckusick 	vaaddr->vawc = 0;
119296a3ed4Smckusick #else
120296a3ed4Smckusick 	br=0x14;
121296a3ed4Smckusick 	cvec=0170;
122296a3ed4Smckusick #endif
1233c99c5afSmckusick 	return (sizeof (struct vadevice));
12426500764Smckusick }
12526500764Smckusick 
12626500764Smckusick /*ARGSUSED*/
127296a3ed4Smckusick vaslave(ui, reg)
128296a3ed4Smckusick 	struct uba_device *ui;
129296a3ed4Smckusick 	caddr_t reg;
130296a3ed4Smckusick {
131296a3ed4Smckusick 
132296a3ed4Smckusick 	ui->ui_dk = 0;
133296a3ed4Smckusick 	return (ui->ui_unit <= 0);
134296a3ed4Smckusick }
135296a3ed4Smckusick 
136296a3ed4Smckusick /*ARGSUSED*/
1371fd191a4Swnj vaattach(ui)
1381fd191a4Swnj 	struct uba_device *ui;
1397e464c69Sbill {
1407e464c69Sbill 
141296a3ed4Smckusick 	ui->ui_mi->um_tab.b_actf = &vabhdr[ui->ui_unit];
1421fd191a4Swnj }
1431fd191a4Swnj 
1441fd191a4Swnj vaopen(dev)
1451fd191a4Swnj 	dev_t dev;
1461fd191a4Swnj {
1471fd191a4Swnj 	register struct va_softc *sc;
1481fd191a4Swnj 	register struct vadevice *vaaddr;
1491fd191a4Swnj 	register struct uba_device *ui;
15002251208Smckusick 	int error;
151296a3ed4Smckusick 	int unit = VAUNIT(dev);
1521fd191a4Swnj 
1532905d7ddSmckusick 	if (unit >= NVA || (sc = &va_softc[unit])->sc_openf ||
1542905d7ddSmckusick 	    (ui = vadinfo[unit]) == 0 || ui->ui_alive == 0)
15502251208Smckusick 		return (ENXIO);
1561fd191a4Swnj 	vaaddr = (struct vadevice *)ui->ui_addr;
1571fd191a4Swnj 	sc->sc_openf = 1;
1581fd191a4Swnj 	vaaddr->vawc = 0;
1591fd191a4Swnj 	sc->sc_state = 0;
160296a3ed4Smckusick 	sc->sc_tocnt = 0;
161296a3ed4Smckusick 	sc->sc_iostate = VAS_IDLE;
1621fd191a4Swnj 	vaaddr->vacsl = VA_IENABLE;
1631fd191a4Swnj 	vatimo(dev);
16402251208Smckusick 	error = vacmd(dev, VPRINT);
16502251208Smckusick 	if (error)
1661fd191a4Swnj 		vaclose(dev);
16702251208Smckusick 	return (error);
1687e464c69Sbill }
1697e464c69Sbill 
1707e464c69Sbill vastrategy(bp)
1717e464c69Sbill 	register struct buf *bp;
1727e464c69Sbill {
173296a3ed4Smckusick 	register struct uba_device *ui;
174296a3ed4Smckusick 	register struct uba_ctlr *um;
175296a3ed4Smckusick 	int s;
1767e464c69Sbill 
177296a3ed4Smckusick 	dprintf("vastrategy(%x)\n", bp);
178296a3ed4Smckusick 	ui = vadinfo[VAUNIT(bp->b_dev)];
179296a3ed4Smckusick 	if (ui == 0 || ui->ui_alive == 0) {
18002251208Smckusick 		bp->b_flags |= B_ERROR;
18102251208Smckusick 		iodone(bp);
182296a3ed4Smckusick 		return;
183296a3ed4Smckusick 	}
184296a3ed4Smckusick 	s = spl4();
185296a3ed4Smckusick 	um = ui->ui_mi;
186296a3ed4Smckusick 	bp->b_actf = NULL;
187296a3ed4Smckusick 	if (um->um_tab.b_actf->b_actf == NULL)
188296a3ed4Smckusick 		um->um_tab.b_actf->b_actf = bp;
189296a3ed4Smckusick 	else {
190296a3ed4Smckusick 		printf("bp = 0x%x, um->um_tab.b_actf->b_actf = 0x%x\n",
191296a3ed4Smckusick 			bp, um->um_tab.b_actf->b_actf);
192296a3ed4Smckusick 		panic("vastrategy");
193296a3ed4Smckusick 		um->um_tab.b_actf->b_actl->b_forw = bp;
194296a3ed4Smckusick 	}
195296a3ed4Smckusick 	um->um_tab.b_actf->b_actl = bp;
196296a3ed4Smckusick 	bp = um->um_tab.b_actf;
197296a3ed4Smckusick 	dprintf("vastrategy: bp=%x actf=%x active=%d\n",
198296a3ed4Smckusick 		bp, bp->b_actf, bp->b_active);
199296a3ed4Smckusick 	if (bp->b_actf && bp->b_active == 0)
200296a3ed4Smckusick 		(void) vastart(um);
201296a3ed4Smckusick 	splx(s);
2027e464c69Sbill }
2037e464c69Sbill 
2047e464c69Sbill int	vablock = 16384;
2057e464c69Sbill 
2067e464c69Sbill unsigned
2077e464c69Sbill minvaph(bp)
2087e464c69Sbill 	struct buf *bp;
2097e464c69Sbill {
2101fd191a4Swnj 
2117e464c69Sbill 	if (bp->b_bcount > vablock)
2127e464c69Sbill 		bp->b_bcount = vablock;
2137e464c69Sbill }
2147e464c69Sbill 
2157e464c69Sbill /*ARGSUSED*/
2163c99c5afSmckusick vawrite(dev, uio)
2171fd191a4Swnj 	dev_t dev;
2183c99c5afSmckusick 	struct uio *uio;
2197e464c69Sbill {
22026500764Smckusick 
2213c99c5afSmckusick 	if (VAUNIT(dev) > NVA)
22202251208Smckusick 		return (ENXIO);
22302251208Smckusick 	return (physio(vastrategy, &rvabuf[VAUNIT(dev)], dev, B_WRITE,
22402251208Smckusick 		    minvaph, uio));
2257e464c69Sbill }
2267e464c69Sbill 
227296a3ed4Smckusick vastart(um)
228296a3ed4Smckusick 	register struct uba_ctlr *um;
2297e464c69Sbill {
230296a3ed4Smckusick 	struct buf *bp;
231296a3ed4Smckusick 	struct vadevice *vaaddr;
232296a3ed4Smckusick 	register struct va_softc *sc;
233296a3ed4Smckusick 	int unit;
2347e464c69Sbill 
235296a3ed4Smckusick 	dprintf("vastart(%x), bp=%x\n", um, um->um_tab.b_actf->b_actf);
236296a3ed4Smckusick 	if ((bp = um->um_tab.b_actf->b_actf) == NULL)
237296a3ed4Smckusick 		return;
238296a3ed4Smckusick 	unit = VAUNIT(bp->b_dev);
239296a3ed4Smckusick 	sc = &va_softc[unit];
240296a3ed4Smckusick 	sc->sc_tocnt = 0;
241296a3ed4Smckusick 	while (sc->sc_iostate&VAS_PIO) {
242296a3ed4Smckusick 		sc->sc_iostate |= VAS_WANT;
243296a3ed4Smckusick 		sleep((caddr_t)&sc->sc_iostate, VAPRI);
244296a3ed4Smckusick 	}
245296a3ed4Smckusick 	sc->sc_iostate |= VAS_DMA;
246296a3ed4Smckusick 	vaaddr = (struct vadevice *)um->um_addr;
247296a3ed4Smckusick 	vaaddr->vacsl = 0;
248296a3ed4Smckusick 	vaaddr->vawc = -(bp->b_bcount / 2);
249296a3ed4Smckusick 	um->um_cmd = VA_DMAGO | VA_IENABLE;
250296a3ed4Smckusick 	(void) ubago(vadinfo[unit]);
2511c3f2b95Smckusick }
2521c3f2b95Smckusick 
253296a3ed4Smckusick vadgo(um)
254296a3ed4Smckusick 	register struct uba_ctlr *um;
2551c3f2b95Smckusick {
256296a3ed4Smckusick 	register struct vadevice *vaaddr = (struct vadevice *)um->um_addr;
257296a3ed4Smckusick 	register struct buf *bp;
2581c3f2b95Smckusick 
259296a3ed4Smckusick 	bp = um->um_tab.b_actf;
260296a3ed4Smckusick 	va_softc[VAUNIT(bp->b_actf->b_dev)].sc_tocnt = 0;
261296a3ed4Smckusick 	bp->b_active++;
262296a3ed4Smckusick 	vaaddr->vaba = um->um_ubinfo;
263296a3ed4Smckusick 	vaaddr->vacsl = ((um->um_ubinfo >> 12) & 0x30) | um->um_cmd;
2647e464c69Sbill }
2657e464c69Sbill 
2667e464c69Sbill /*ARGSUSED*/
2673c99c5afSmckusick vaioctl(dev, cmd, data, flag)
2683c99c5afSmckusick 	register caddr_t data;
2697e464c69Sbill {
2701fd191a4Swnj 	register struct va_softc *sc = &va_softc[VAUNIT(dev)];
2717e464c69Sbill 
2727e464c69Sbill 	switch (cmd) {
2737e464c69Sbill 
2747e464c69Sbill 	case VGETSTATE:
2753c99c5afSmckusick 		*(int *)data = sc->sc_state;
27602251208Smckusick 		break;
2777e464c69Sbill 
2787e464c69Sbill 	case VSETSTATE:
27902251208Smckusick 		return (vacmd(dev, *(int *)data));
2807e464c69Sbill 
2817e464c69Sbill 	default:
28202251208Smckusick 		return (ENOTTY);
2837e464c69Sbill 	}
28402251208Smckusick 	return (0);
2857e464c69Sbill }
2867e464c69Sbill 
2871fd191a4Swnj vacmd(dev, vcmd)
2881fd191a4Swnj 	dev_t dev;
2891fd191a4Swnj 	int vcmd;
2907e464c69Sbill {
2911fd191a4Swnj 	register struct va_softc *sc = &va_softc[VAUNIT(dev)];
29202251208Smckusick 	int error = 0;
293296a3ed4Smckusick 	int s, cmd;
2941fd191a4Swnj 
295296a3ed4Smckusick 	s = spl4();
296296a3ed4Smckusick 	while (sc->sc_iostate&VAS_DMA) {
297296a3ed4Smckusick 		sc->sc_iostate |= VAS_WANT;
298296a3ed4Smckusick 		sleep((caddr_t)&sc->sc_iostate, VAPRI);
299296a3ed4Smckusick 	}
300296a3ed4Smckusick 	sc->sc_iostate |= VAS_PIO;
301296a3ed4Smckusick 	sc->sc_tocnt = 0;
302296a3ed4Smckusick 	cmd = 0;
3037e464c69Sbill 	switch (vcmd) {
3047e464c69Sbill 
3057e464c69Sbill 	case VPLOT:
3067e464c69Sbill 		/* Must turn on plot AND autostep modes. */
307296a3ed4Smckusick 		if (vadopio(dev, VAPLOT))
30802251208Smckusick 			error = EIO;
309296a3ed4Smckusick 		cmd = VAAUTOSTEP;
3107e464c69Sbill 		break;
3117e464c69Sbill 
3127e464c69Sbill 	case VPRINT:
313296a3ed4Smckusick 		cmd = VAPRINT;
3147e464c69Sbill 		break;
3157e464c69Sbill 
3167e464c69Sbill 	case VPRINTPLOT:
317296a3ed4Smckusick 		cmd = VAPRINTPLOT;
3187e464c69Sbill 		break;
3197e464c69Sbill 	}
3201fd191a4Swnj 	sc->sc_state = (sc->sc_state & ~(VPLOT|VPRINT|VPRINTPLOT)) | vcmd;
321296a3ed4Smckusick 	if (cmd && vadopio(dev, cmd))
32202251208Smckusick 		error = EIO;
323296a3ed4Smckusick 	sc->sc_iostate &= ~VAS_PIO;
324296a3ed4Smckusick 	if (sc->sc_iostate&VAS_WANT) {
325296a3ed4Smckusick 		sc->sc_iostate &= ~VAS_WANT;
326296a3ed4Smckusick 		wakeup((caddr_t)&sc->sc_iostate);
327296a3ed4Smckusick 	}
328296a3ed4Smckusick 	splx(s);
32902251208Smckusick 	return (error);
3307e464c69Sbill }
3317e464c69Sbill 
332296a3ed4Smckusick vadopio(dev, cmd)
333296a3ed4Smckusick 	dev_t dev;
334296a3ed4Smckusick 	int cmd;
335296a3ed4Smckusick {
336296a3ed4Smckusick 	register struct vadevice *vaaddr =
337296a3ed4Smckusick 	    (struct vadevice *)vaminfo[VAUNIT(dev)]->um_addr;
338296a3ed4Smckusick 	register struct va_softc *sc = &va_softc[VAUNIT(dev)];
339296a3ed4Smckusick 
340296a3ed4Smckusick 	sc->sc_info = 0;
341296a3ed4Smckusick 	vaaddr->vacsh = cmd;
342296a3ed4Smckusick 	while ((sc->sc_info&(VA_DONE|VA_ERROR)) == 0)
343296a3ed4Smckusick 		sleep((caddr_t)&sc->sc_info, VAPRI);
344296a3ed4Smckusick 	return (sc->sc_info&VA_ERROR);
345296a3ed4Smckusick }
346296a3ed4Smckusick 
3471fd191a4Swnj vatimo(dev)
3481fd191a4Swnj 	dev_t dev;
3497e464c69Sbill {
3501fd191a4Swnj 	register struct va_softc *sc = &va_softc[VAUNIT(dev)];
3511fd191a4Swnj 
3521fd191a4Swnj 	if (sc->sc_openf)
353296a3ed4Smckusick 		timeout(vatimo, (caddr_t)dev, hz/2);
354296a3ed4Smckusick 	if (++sc->sc_tocnt < 2)
355296a3ed4Smckusick 		return;
356296a3ed4Smckusick 	sc->sc_tocnt = 0;
357296a3ed4Smckusick 	dprintf("vatimo: calling vaintr\n");
3581fd191a4Swnj 	vaintr(dev);
3597e464c69Sbill }
3607e464c69Sbill 
3617e464c69Sbill /*ARGSUSED*/
3627e464c69Sbill vaintr(dev)
3631fd191a4Swnj 	dev_t dev;
3647e464c69Sbill {
365296a3ed4Smckusick 	register struct uba_ctlr *um;
366296a3ed4Smckusick 	struct vadevice *vaaddr;
367296a3ed4Smckusick 	struct buf *bp;
368296a3ed4Smckusick 	register int unit = VAUNIT(dev), e;
369296a3ed4Smckusick 	register struct va_softc *sc = &va_softc[unit];
3701fd191a4Swnj 
371296a3ed4Smckusick 	um = vaminfo[unit];
372296a3ed4Smckusick 	vaaddr = (struct vadevice *)um->um_addr;
373296a3ed4Smckusick 	e = vaaddr->vacsw;
374296a3ed4Smckusick 	dprintf("vaintr: um=0x%x, e=0x%x, b_active %d\n",
375296a3ed4Smckusick 		um, e, um->um_tab.b_actf->b_active);
376296a3ed4Smckusick 	if ((e&(VA_DONE|VA_ERROR)) == 0)
377296a3ed4Smckusick 		return;
378296a3ed4Smckusick 	vaaddr->vacsl = 0;
379296a3ed4Smckusick 	if ((e&VA_ERROR) && (e&VA_NPRTIMO))
380296a3ed4Smckusick 		printf("va%d: npr timeout\n", unit);
381296a3ed4Smckusick 	if (sc->sc_iostate&VAS_PIO) {
382296a3ed4Smckusick 		sc->sc_info = e;
383296a3ed4Smckusick 		wakeup((caddr_t)&sc->sc_info);
384296a3ed4Smckusick 		return;
385296a3ed4Smckusick 	}
386296a3ed4Smckusick 	if (um->um_tab.b_actf->b_active) {
387296a3ed4Smckusick 		bp = um->um_tab.b_actf->b_actf;
388296a3ed4Smckusick 		if (e&VA_ERROR)
389296a3ed4Smckusick 			bp->b_flags |= B_ERROR;
390296a3ed4Smckusick 		if (sc->sc_state&VPRINTPLOT) {
391296a3ed4Smckusick 			sc->sc_state = (sc->sc_state & ~VPRINTPLOT) | VPLOT;
392296a3ed4Smckusick 			vaaddr->vacsh = VAAUTOSTEP;
393296a3ed4Smckusick 			return;
394296a3ed4Smckusick 		}
395296a3ed4Smckusick 		ubadone(um);
396296a3ed4Smckusick 		um->um_tab.b_actf->b_active = 0;
397296a3ed4Smckusick 		um->um_tab.b_actf->b_actf = bp->b_forw;
398296a3ed4Smckusick 		bp->b_active = 0;
399296a3ed4Smckusick 		bp->b_errcnt = 0;
400296a3ed4Smckusick 		bp->b_resid = 0;
401296a3ed4Smckusick 		iodone(bp);
402296a3ed4Smckusick 	}
403296a3ed4Smckusick 	if (um->um_tab.b_actf->b_actf == 0) {
404296a3ed4Smckusick 		sc->sc_iostate &= ~VAS_DMA;
405296a3ed4Smckusick 		if (sc->sc_iostate&VAS_WANT) {
406296a3ed4Smckusick 			sc->sc_iostate &= ~VAS_WANT;
407296a3ed4Smckusick 			wakeup((caddr_t)&sc->sc_iostate);
408296a3ed4Smckusick 		}
409296a3ed4Smckusick 		return;
410296a3ed4Smckusick 	}
411296a3ed4Smckusick 	if (um->um_tab.b_actf->b_active == 0)
412296a3ed4Smckusick 		vastart(um);
4137e464c69Sbill }
4147e464c69Sbill 
4151fd191a4Swnj vaclose(dev)
4161fd191a4Swnj 	dev_t dev;
4177e464c69Sbill {
4181fd191a4Swnj 	register struct va_softc *sc = &va_softc[VAUNIT(dev)];
4191fd191a4Swnj 	register struct vadevice *vaaddr =
4201fd191a4Swnj 	    (struct vadevice *)vadinfo[VAUNIT(dev)]->ui_addr;
4217e464c69Sbill 
4221fd191a4Swnj 	sc->sc_openf = 0;
4231fd191a4Swnj 	sc->sc_state = 0;
424296a3ed4Smckusick 	if (sc->sc_iostate != VAS_IDLE)
425296a3ed4Smckusick 		wakeup((caddr_t)&sc->sc_iostate);
426296a3ed4Smckusick 	sc->sc_iostate = VAS_IDLE;
4271fd191a4Swnj 	vaaddr->vacsl = 0;
428296a3ed4Smckusick 	vaaddr->vawc = 0;
4297e464c69Sbill }
4306fa58dcaSbill 
4311fd191a4Swnj vareset(uban)
4321fd191a4Swnj 	int uban;
4336fa58dcaSbill {
4341fd191a4Swnj 	register int va11;
435296a3ed4Smckusick 	register struct uba_ctlr *um;
4361fd191a4Swnj 	register struct vadevice *vaaddr;
437296a3ed4Smckusick 	register struct va_softc *sc;
4386fa58dcaSbill 
4391fd191a4Swnj 	for (va11 = 0; va11 < NVA; va11++, sc++) {
440296a3ed4Smckusick 		if ((um = vaminfo[va11]) == 0 || um->um_ubanum != uban ||
441296a3ed4Smckusick 		    um->um_alive == 0)
442296a3ed4Smckusick 			continue;
443296a3ed4Smckusick 		sc = &va_softc[um->um_ctlr];
444296a3ed4Smckusick 		if (sc->sc_openf == 0)
4451fd191a4Swnj 			continue;
4461fd191a4Swnj 		printf(" va%d", va11);
447296a3ed4Smckusick 		vaaddr = (struct vadevice *)um->um_addr;
4481fd191a4Swnj 		vaaddr->vacsl = VA_IENABLE;
4491fd191a4Swnj 		if (sc->sc_state & VPLOT) {
4501fd191a4Swnj 			vaaddr->vacsh = VAPLOT;
4516fa58dcaSbill 			DELAY(10000);
4521fd191a4Swnj 			vaaddr->vacsh = VAAUTOSTEP;
4531fd191a4Swnj 		} else if (sc->sc_state & VPRINTPLOT)
4541fd191a4Swnj 			vaaddr->vacsh = VPRINTPLOT;
4556fa58dcaSbill 		else
4561fd191a4Swnj 			vaaddr->vacsh = VAPRINTPLOT;
4576fa58dcaSbill 		DELAY(10000);
4582905d7ddSmckusick 		sc->sc_iostate = VAS_IDLE;
4592905d7ddSmckusick 		um->um_tab.b_actf->b_active = 0;
4602905d7ddSmckusick 		um->um_tab.b_actf->b_actf = um->um_tab.b_actf->b_actl = 0;
4612905d7ddSmckusick 		if (um->um_ubinfo) {
4622905d7ddSmckusick 			printf("<%d>", (um->um_ubinfo >> 28) & 0xf);
4632905d7ddSmckusick 			um->um_ubinfo = 0;
4642905d7ddSmckusick 		}
465296a3ed4Smckusick 		(void) vastart(um);
4661fd191a4Swnj 	}
4676fa58dcaSbill }
468bc3f32ddSsam 
469bc3f32ddSsam vaselect()
470bc3f32ddSsam {
47102251208Smckusick 
472bc3f32ddSsam 	return (1);
473bc3f32ddSsam }
47406c4b8caSbill #endif
475