Annotation of xinu/sys/dlciin.c, revision 1.1

1.1     ! root        1: /* dlciin.c - dlciin */
        !             2: 
        !             3: #include <conf.h>
        !             4: #include <kernel.h>
        !             5: #include <slu11.h>
        !             6: #include <proc.h>
        !             7: #include <sleep.h>
        !             8: #include <dlc.h>
        !             9: 
        !            10: /*------------------------------------------------------------------------
        !            11:  *  dlciin  --  dlc input interrupt handler (block + normal modes)
        !            12:  *------------------------------------------------------------------------
        !            13:  */
        !            14: INTPROC        dlciin(dptr)
        !            15: register struct        dlblk   *dptr;
        !            16: {
        !            17:        struct  csr *cptr;
        !            18:        register char   ch;
        !            19:        int     icode;
        !            20: 
        !            21:        ch = ( (icode = ((cptr=dptr->dioaddr)->crbuf)) ) & SLUCHMASK;
        !            22: 
        !            23:        switch (dptr->distate) {
        !            24: 
        !            25:        case DLIINIT:                           /* non-blockmode read */
        !            26:                        if (ch == DLRESTART && dptr->dostate!=DLOINIT) {
        !            27:                                dptr->dostate = DLORESTART;
        !            28:                                return;
        !            29:                        }
        !            30:                        if (dptr->dpid)
        !            31:                                sendf(dptr->dpid, (ch&0377) );
        !            32:                        return;
        !            33: 
        !            34:        case DLIREADY:                          /* ready for block */
        !            35:                        if (ch == DLSTART) {
        !            36:                                dptr->distate = DLIREAD;
        !            37:                                defclk++;
        !            38:                                if (currpid == NULLPROC)
        !            39:                                        proctab[NULLPROC].pprio = MAXINT;
        !            40:                                else {
        !            41:                                        insert(dequeue(NULLPROC),rdyhead,
        !            42:                                        proctab[NULLPROC].pprio=MAXINT);
        !            43:                                        resched();
        !            44:                                }
        !            45:                        } else {                /* unexpected character */
        !            46:                                dptr->dochar = DLRESTART;
        !            47:                                dptr->dovalid = TRUE;
        !            48:                                cptr->ctstat = SLUENABLE;
        !            49:                                dptr->distate = DLIWAIT;
        !            50:                        }
        !            51:                        return;
        !            52: 
        !            53:        case DLIREAD:                           /* doing blockmode read */
        !            54:                        if (icode & SLUERMASK) {        /* input error  */
        !            55:                                dptr->distate = DLIWAIT;
        !            56:                                dptr->dicount = 0;
        !            57:                                dptr->dinext = dptr->distart;
        !            58:                                dptr->diesc = FALSE;
        !            59:                                dptr->dochar = DLRESTART;
        !            60:                                dptr->dovalid = TRUE;
        !            61:                                cptr->ctstat = SLUENABLE;
        !            62:                                proctab[NULLPROC].pprio = 0;
        !            63:                                strtclk();
        !            64:                                return;
        !            65:                        }
        !            66:                        if (ch == DLEOB) {      /* end of block */
        !            67:                                dptr->distate = DLIDONE;
        !            68:                                ready(dptr->diproc, RESCHNO);
        !            69:                                proctab[NULLPROC].pprio = 0;
        !            70:                                strtclk();
        !            71:                                resched();
        !            72:                                return;
        !            73:                        }
        !            74:                        if (ch == DLSTART) {            /* restart read */
        !            75:                                dptr->diesc = FALSE;
        !            76:                                dptr->dinext = dptr->distart;
        !            77:                                dptr->dicount = 0;
        !            78:                                return;
        !            79:                        }
        !            80:                        if (dptr->diesc) {              /* map escapes  */
        !            81:                                dptr->diesc = FALSE;
        !            82:                                if ( ch & DLESCBIT) {   /* impossible   */
        !            83:                                        dptr->distate = DLIWAIT;
        !            84:                                        dptr->dicount = 0;
        !            85:                                        dptr->dinext = dptr->distart;
        !            86:                                        dptr->dochar = DLRESTART;
        !            87:                                        dptr->dovalid = TRUE;
        !            88:                                        cptr->ctstat = SLUENABLE;
        !            89:                                        proctab[NULLPROC].pprio = 0;
        !            90:                                        strtclk();
        !            91:                                        return;
        !            92:                                } else
        !            93:                                        ch |= DLESCBIT;
        !            94:                        } else if (ch == DLESC) {       /* escape next  */
        !            95:                                dptr->diesc = TRUE;
        !            96:                                return;
        !            97:                        }
        !            98:                        *dptr->dinext++ = ch;
        !            99:                        if ( ++(dptr->dicount) >= dptr->dimax ) {
        !           100:                                dptr->distate = DLIDONE;
        !           101:                                ready(dptr->diproc, RESCHNO);
        !           102:                                proctab[NULLPROC].pprio = 0;
        !           103:                                strtclk();
        !           104:                                resched();
        !           105:                        }
        !           106:                        return;
        !           107: 
        !           108:        case DLIWAIT:
        !           109:                        if (ch == DLSTART) {
        !           110:                                dptr->distate = DLIREAD;
        !           111:                                defclk++;
        !           112:                                if (currpid == NULLPROC)
        !           113:                                        proctab[NULLPROC].pprio = MAXINT;
        !           114:                                else {
        !           115:                                        insert(dequeue(NULLPROC),rdyhead,
        !           116:                                        proctab[NULLPROC].pprio=MAXINT);
        !           117:                                        resched();
        !           118:                                }
        !           119:                        } else if (ch == DLEOB)
        !           120:                                dptr->distate = DLIREADY;
        !           121:                        return;
        !           122: 
        !           123:        case DLIDONE:
        !           124:                        return;
        !           125: 
        !           126:        default:
        !           127:                        panic("impossible dlc input state");
        !           128:        }
        !           129: }

unix.superglobalmegacorp.com

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