Annotation of xinu/sys/dlciin.c, revision 1.1.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.