Annotation of cci/sys/vba/vcm.c, revision 1.1

1.1     ! root        1: #include "vx.h"
        !             2: #if NVX > 0
        !             3: /*
        !             4:  *     VIOC-X Modem control
        !             5:  */
        !             6: 
        !             7: #include "../h/param.h"
        !             8: #include "../h/file.h"
        !             9: #include "../h/ioctl.h"
        !            10: #include "../h/tty.h"
        !            11: #include "../h/conf.h"
        !            12: #include "../vba/vioc.h"
        !            13: #include "../vba/vxdebug.h"
        !            14: 
        !            15: #include "vbsc.h"
        !            16: #if NVBSC > 0
        !            17: #include "../bsc/bscio.h"
        !            18: #include "../bsc/bsc.h"
        !            19: extern char bscport[];
        !            20: #endif
        !            21: 
        !            22: 
        !            23: extern struct  vcx     vcx[] ;
        !            24: extern struct  tty     vx_tty[];
        !            25: extern struct  vcmds   v_cmds[] ;
        !            26: 
        !            27: extern int     vxstart() ;
        !            28: extern struct  vxcmd   *vobtain() ;
        !            29: extern struct  vxcmd   *nextcmd() ;
        !            30: 
        !            31: long viocPC = 0;
        !            32: 
        !            33: vcmodem(dev,flag)
        !            34: dev_t dev ;
        !            35: {
        !            36:        struct tty *tp ;
        !            37:        register struct vxcmd *cp ;
        !            38:        register struct vcx *xp ;
        !            39:        register struct vblok *kp ;
        !            40:        register port ;
        !            41: 
        !            42:        port = minor(dev) ;
        !            43:        tp = &vx_tty[port] ;
        !            44:        port &= 017 ;
        !            45:        xp = (struct vcx *)tp->t_addr ;
        !            46:        cp = vobtain(xp) ;
        !            47:        kp = VBAS(xp->v_nbr) ;
        !            48: 
        !            49:        /*
        !            50:         * Issue MODEM command
        !            51:         */
        !            52:        cp->cmd = MDMCTL ;
        !            53:        cp->par[0] = (flag == VMOD_ON) ? V_ENAB : V_DISAB ;
        !            54:        cp->par[1] = port;
        !            55:        vcmd(xp->v_nbr, &cp->cmd) ;
        !            56:        port -= xp->v_loport ;
        !            57:        if((kp->v_dcd >> port) & 1) {
        !            58:                if(flag == VMOD_ON)
        !            59:                        tp->t_state |= TS_CARR_ON ;
        !            60:                return(1) ;
        !            61:        }
        !            62:        return(0) ;
        !            63: }
        !            64: 
        !            65: 
        !            66: /*
        !            67:  * VCMINTR called when an unsolicited interrup occurs signaling
        !            68:  * some change of modem control state.
        !            69:  */
        !            70: vcmintr(n)
        !            71: register n ;   /* viocx number */
        !            72: {
        !            73:        register struct vblok *kp ;
        !            74:        register struct tty *tp ;
        !            75:        register port ;
        !            76: 
        !            77:        kp = VBAS( n ) ;
        !            78:        port = kp->v_usdata[0] & 017 ;
        !            79:        tp = &vx_tty[port+n*16] ;
        !            80: 
        !            81: #if NVBSC > 0
        !            82:                        /*
        !            83:                         * Check for change in DSR for BISYNC port.
        !            84:                         */
        !            85:        if ((kp->v_ustat & DSR_CHG) && (bscport[port+n*16] & BISYNC)) {
        !            86:                register struct vcx *xp ;
        !            87:                register struct bsc *bp ;
        !            88:                extern   struct bsc bsc[] ;
        !            89: 
        !            90:                bp = &bsc[((minor(tp->t_dev)) >> 4) & 0xf] ;
        !            91:                bp->b_hlflgs &= ~BSC_DSR ;
        !            92:                if (kp->v_ustat & DSR_ON)
        !            93:                        bp->b_hlflgs |= BSC_DSR ;
        !            94:        }
        !            95:        if (bscport[port+n*16] & BISYNC) return;
        !            96: #endif
        !            97: 
        !            98: #ifdef VX_DEBUG
        !            99:        if (vxdebug & VXVCM)
        !           100:                printf("vcmintr: VX%d, port%lx, v_ustat: %lx, t_state: %lx\n",
        !           101:                        n,port,kp->v_ustat&0xff,tp->t_state);
        !           102: #endif
        !           103: 
        !           104:        if((kp->v_ustat & DCD_ON) && ((tp->t_state & TS_CARR_ON) == 0) ) {
        !           105:                tp->t_state |= TS_CARR_ON ;
        !           106:                wakeup((caddr_t)&tp->t_canq) ;
        !           107:                return ;
        !           108:        }
        !           109: 
        !           110:        if((kp->v_ustat & DCD_OFF) && (tp->t_state & TS_CARR_ON)) {
        !           111:                tp->t_state &= ~TS_CARR_ON ;
        !           112:                if(tp->t_state & TS_ISOPEN) {
        !           113:                        register struct vcx *xp ;
        !           114:                        register struct vcmds *cp ;
        !           115:                        register struct vxcmd *cmdp ;
        !           116: 
        !           117:                        ttyflush(tp, FREAD|FWRITE);
        !           118:                        /* clear all pending trnansmits */
        !           119:                        xp = &vcx[n];
        !           120:                        if(tp->t_state&(TS_BUSY|TS_FLUSH) && xp->v_vers==V_NEW)
        !           121:                                {
        !           122:                                int i, cmdfound = 0;
        !           123:                                cp = &v_cmds[n];
        !           124:                                for(i = cp->v_empty; i!=cp->v_fill; ) {
        !           125:                                        cmdp = (struct vxcmd *)((long *)cp->cmdbuf[i]-1);
        !           126:                                        if((cmdp->cmd==XMITDTA || cmdp->cmd==XMITIMM)
        !           127:                                         && ((struct vxmit *)cmdp->par)->line == port) {
        !           128:                                                cmdfound++;
        !           129:                                                cmdp->cmd = FDTATOX ;
        !           130:                                                cmdp->par[1] = port ;
        !           131:                                        }
        !           132:                                        if(++i >= VC_CMDBUFL)
        !           133:                                                i = 0;
        !           134:                                }
        !           135:                                if(cmdfound)
        !           136:                                        tp->t_state &= ~(TS_BUSY|TS_FLUSH);
        !           137:                                /* cmd is already in vioc, have to flush it */
        !           138:                                else {
        !           139:                                        cmdp = vobtain(xp);
        !           140:                                        cmdp->cmd = FDTATOX ;
        !           141:                                        cmdp->par[1] = port ;
        !           142:                                        vcmd(n, &cmdp->cmd);
        !           143:                                }
        !           144:                        }
        !           145:                        if((tp->t_flags&NOHANG)==0) {
        !           146:                                gsignal(tp->t_pgrp, SIGHUP) ;
        !           147:                                gsignal(tp->t_pgrp, SIGCONT);
        !           148:                        }
        !           149:                }
        !           150:                return ;
        !           151:        }
        !           152: 
        !           153:        if((kp->v_ustat & BRK_CHR)  && (tp->t_state & TS_ISOPEN) ) {
        !           154:                (*linesw[tp->t_line].l_rint)(tp->t_intrc & 0377, tp) ;
        !           155:                return ;
        !           156:        }
        !           157: }
        !           158: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.