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