cbe9452fc8ed0d1630c2d5b8167d5dd45f93ede4
u_short vaba
; /* buffer address */
short vawc
; /* word count (2's complement) */
short Vacsw
; /* control status as word */
struct { /* control status as bytes */
short vadata
; /* programmed i/o data buffer */
#define vacsh vacs.vacsr.Vacsh
#define vacsl vacs.vacsr.Vacsl
#define VA_ERROR 0100000 /* some error has occurred */
#define VA_NPRTIMO 0001000 /* DMA timeout error */
#define VA_NOTREADY 0000400 /* something besides NPRTIMO */
#define VA_IENABLE 0000100 /* interrupt enable */
#define VA_SUPPLIESLOW 0000004
#define VA_BOTOFFORM 0000002
#define VA_BYTEREVERSE 0000001 /* reverse byte order in words */
/* vacsh command bytes */
#define VAPRINTPLOT 0000160
#define VAAUTOSTEP 0000244
#define VANOAUTOSTEP 0000045
#define VAFORMFEED 0000263
#define VAUNIT(dev) (minor(dev))
int vaprobe(), vaattach();
struct uba_device
*vadinfo
[NVA
];
u_short vastd
[] = { 0764000, 0 };
struct uba_driver vadriver
=
{ vaprobe
, 0, vaattach
, 0, vastd
, "va", vadinfo
};
register int br
, cvec
; /* value-result */
register struct vadevice
*vaaddr
= (struct vadevice
*)reg
;
vaaddr
->vacsl
= VA_IENABLE
;
register struct va_softc
*sc
;
register struct vadevice
*vaaddr
;
register struct uba_device
*ui
;
if (VAUNIT(dev
) >= NVA
|| (sc
= &va_softc
[minor(dev
)])->sc_openf
||
(ui
= vadinfo
[VAUNIT(dev
)]) == 0 || ui
->ui_alive
== 0) {
vaaddr
= (struct vadevice
*)ui
->ui_addr
;
vaaddr
->vacsl
= VA_IENABLE
;
register struct va_softc
*sc
= &va_softc
[VAUNIT(bp
->b_dev
)];
register struct uba_device
*ui
= vadinfo
[VAUNIT(bp
->b_dev
)];
register struct vadevice
*vaaddr
= (struct vadevice
*)ui
->ui_addr
;
sleep((caddr_t
)sc
, VAPRI
);
sc
->sc_ubinfo
= ubasetup(ui
->ui_ubanum
, bp
, UBA_NEEDBDP
);
if (e
= vawait(bp
->b_dev
))
sc
->sc_wc
= -(bp
->b_bcount
/2);
if (sc
->sc_state
& VPRINTPLOT
) {
sc
->sc_state
= (sc
->sc_state
& ~VPRINTPLOT
) | VPLOT
;
vaaddr
->vacsh
= VAAUTOSTEP
;
ubarelse(ui
->ui_ubanum
, &sc
->sc_ubinfo
);
if (bp
->b_bcount
> vablock
)
physio(vastrategy
, &rvabuf
[VAUNIT(dev
)], dev
, B_WRITE
, minvaph
);
register struct vadevice
*vaaddr
=
(struct vadevice
*)vadinfo
[VAUNIT(dev
)]->ui_addr
;
while (((e
= vaaddr
->vacsw
) & (VA_DONE
|VA_ERROR
)) == 0)
sleep((caddr_t
)&va_softc
[VAUNIT(dev
)], VAPRI
);
printf("va%d: npr timeout\n", VAUNIT(dev
));
register struct va_softc
*sc
= &va_softc
[VAUNIT(dev
)];
register struct vadevice
*vaaddr
=
(struct vadevice
*)vadinfo
[VAUNIT(dev
)]->ui_addr
;
vaaddr
->vaba
= sc
->sc_ubinfo
;
vaaddr
->vacsl
= (sc
->sc_ubinfo
>> 12) & 0x30;
vaaddr
->vawc
= sc
->sc_wc
;
vaioctl(dev
, cmd
, addr
, flag
)
register struct va_softc
*sc
= &va_softc
[VAUNIT(dev
)];
(void) suword(addr
, sc
->sc_state
);
register struct va_softc
*sc
= &va_softc
[VAUNIT(dev
)];
register struct vadevice
*vaaddr
=
(struct vadevice
*)vadinfo
[VAUNIT(dev
)]->ui_addr
;
/* Must turn on plot AND autostep modes. */
vaaddr
->vacsh
= VAAUTOSTEP
;
vaaddr
->vacsh
= VAPRINTPLOT
;
sc
->sc_state
= (sc
->sc_state
& ~(VPLOT
|VPRINT
|VPRINTPLOT
)) | vcmd
;
register struct va_softc
*sc
= &va_softc
[VAUNIT(dev
)];
timeout(vatimo
, (caddr_t
)dev
, hz
/10);
register struct va_softc
*sc
= &va_softc
[VAUNIT(dev
)];
register struct va_softc
*sc
= &va_softc
[VAUNIT(dev
)];
register struct vadevice
*vaaddr
=
(struct vadevice
*)vadinfo
[VAUNIT(dev
)]->ui_addr
;
register struct uba_device
*ui
;
register struct va_softc
*sc
= va_softc
;
register struct vadevice
*vaaddr
;
for (va11
= 0; va11
< NVA
; va11
++, sc
++) {
if ((ui
= vadinfo
[va11
]) == 0 || ui
->ui_alive
== 0 ||
ui
->ui_ubanum
!= uban
|| sc
->sc_openf
== 0)
vaaddr
= (struct vadevice
*)ui
->ui_addr
;
vaaddr
->vacsl
= VA_IENABLE
;
if (sc
->sc_state
& VPLOT
) {
vaaddr
->vacsh
= VAAUTOSTEP
;
} else if (sc
->sc_state
& VPRINTPLOT
)
vaaddr
->vacsh
= VPRINTPLOT
;
vaaddr
->vacsh
= VAPRINTPLOT
;
printf("<%d>", (sc
->sc_ubinfo
>>28)&0xf);
ubarelse(ui
->ui_ubanum
, &sc
->sc_ubinfo
);
sc
->sc_ubinfo
= ubasetup(ui
->ui_ubanum
, sc
->sc_bp
, UBA_NEEDBDP
);
sc
->sc_wc
= -(sc
->sc_bp
->b_bcount
/2);
vastart(sc
->sc_bp
->b_dev
);