#include "../tahoevba/vioc.h"
#include "../tahoebsc/bscio.h"
#include "../tahoebsc/bsc.h"
extern struct vcx vcx
[] ;
extern struct tty vx_tty
[];
extern struct vcmds v_cmds
[] ;
extern struct vxcmd
*vobtain() ;
extern struct vxcmd
*nextcmd() ;
register struct vxcmd
*cp
;
register struct vcx
*xp
;
register struct vblok
*kp
;
xp
= (struct vcx
*)tp
->t_addr
;
cp
->par
[0] = (flag
== VMOD_ON
) ? V_ENAB
: V_DISAB
;
vcmd(xp
->v_nbr
, (caddr_t
)&cp
->cmd
) ;
if((kp
->v_dcd
>> port
) & 1) {
tp
->t_state
|= TS_CARR_ON
;
* VCMINTR called when an unsolicited interrup occurs signaling
* some change of modem control state.
register n
; /* viocx number */
register struct vblok
*kp
;
register struct tty
*tp
;
port
= kp
->v_usdata
[0] & 017 ;
tp
= &vx_tty
[port
+n
*16] ;
* Check for change in DSR for BISYNC port.
if ((kp
->v_ustat
& DSR_CHG
) && (bscport
[port
+n
*16] & BISYNC
)) {
register struct vcx
*xp
;
register struct bsc
*bp
;
extern struct bsc bsc
[] ;
xp
= (struct vcx
*)tp
->t_addr
;
bp
= &bsc
[minor(tp
->t_dev
)] ;
bp
->b_hlflgs
&= ~BSC_DSR
;
if (kp
->v_ustat
& DSR_ON
)
bp
->b_hlflgs
|= BSC_DSR
;
/*debug*/printf("BSC DSR Chg: %x\n", kp
->v_ustat
& DSR_CHG
);
if (bscport
[port
+n
*16] & BISYNC
) return;
if((kp
->v_ustat
& DCD_ON
) && ((tp
->t_state
& TS_CARR_ON
) == 0) ) {
tp
->t_state
|= TS_CARR_ON
;
wakeup((caddr_t
)&tp
->t_canq
) ;
if((kp
->v_ustat
& DCD_OFF
) && (tp
->t_state
& TS_CARR_ON
)) {
tp
->t_state
&= ~TS_CARR_ON
;
if(tp
->t_state
& TS_ISOPEN
) {
register struct vcx
*xp
;
register struct vcmds
*cp
;
register struct vxcmd
*cmdp
;
ttyflush(tp
, FREAD
|FWRITE
);
/* clear all pending trnansmits */
if(tp
->t_state
&(TS_BUSY
|TS_FLUSH
) && xp
->v_vers
==V_NEW
) {
for(i
= cp
->v_empty
; i
!=cp
->v_fill
; ) {
cmdp
= (struct vxcmd
*)((long *)cp
->cmdbuf
[i
]-1);
if((cmdp
->cmd
==XMITDTA
|| cmdp
->cmd
==XMITIMM
)
&& ((struct vxmit
*)cmdp
->par
)->line
== port
) {
tp
->t_state
&= ~(TS_BUSY
|TS_FLUSH
);
/* cmd is already in vioc, have to flush it */
vcmd(n
, (caddr_t
)&cmdp
->cmd
);
if((tp
->t_flags
&NOHANG
)==0) {
gsignal(tp
->t_pgrp
, SIGHUP
) ;
gsignal(tp
->t_pgrp
, SIGCONT
);
if((kp
->v_ustat
& BRK_CHR
) && (tp
->t_state
& TS_ISOPEN
) ) {
(*linesw
[tp
->t_line
].l_rint
)(tp
->t_intrc
& 0377, tp
) ;