Annotation of researchv8dc/sys/dev/mg.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * DR11C for Mergenthaler 202
        !             3:  */
        !             4: #include "mg.h"
        !             5: #if NMG
        !             6: #include "../h/param.h"
        !             7: #include "../h/systm.h"
        !             8: #include "../h/stream.h"
        !             9: #include "../h/ioctl.h"
        !            10: #include "../h/pte.h"
        !            11: #include "../h/map.h"
        !            12: #include "../h/buf.h"
        !            13: #include "../h/ubavar.h"
        !            14: #include "../h/conf.h"
        !            15: 
        !            16: struct device {
        !            17:        unsigned short csr;
        !            18:        unsigned short wbuf;
        !            19:        unsigned short rbuf;
        !            20: };
        !            21: 
        !            22: struct device  *MGADDR;
        !            23: 
        !            24: struct {
        !            25:        char busy;
        !            26:        struct queue *rq;
        !            27:        struct queue *wq;
        !            28: } mg;
        !            29: 
        !            30: 
        !            31: /*
        !            32:  * Hardware control bits
        !            33:  */
        !            34: #define CSR0 1
        !            35: #define CSR1 2
        !            36: #define REQA 0200
        !            37: #define REQB 0100000
        !            38: #define INTA 0100
        !            39: #define INTB 040
        !            40: 
        !            41: 
        !            42: int    nodev(), mgopen(), mgclose(), mgoput();
        !            43: 
        !            44: static struct qinit mgrinit = { nodev, NULL, mgopen, mgclose, 0, 0 };
        !            45:        struct qinit mgwinit = { mgoput, NULL, mgopen, mgclose, 200, 100 };
        !            46: struct streamtab mginfo = { &mgrinit, &mgwinit };
        !            47: 
        !            48: int    mgattach(), mgprobe();
        !            49: struct uba_device *mgstuff[NMG];
        !            50: u_short        mgstd[] = { 0 };
        !            51: struct uba_driver mgdriver =
        !            52:        { mgprobe, 0, mgattach, 0, mgstd, "mg", mgstuff };
        !            53: 
        !            54: mgprobe(reg)
        !            55: caddr_t reg;
        !            56: {
        !            57:        register int br, cvec;
        !            58:        register struct device *mgaddr = (struct device *)reg;
        !            59: 
        !            60:        mg.busy = 0;
        !            61:        mg.rq = mg.wq = NULL;
        !            62:        MGADDR = mgaddr;
        !            63:        mgaddr->csr = INTA;
        !            64:        DELAY(10000);
        !            65:        mgaddr->csr = 0;
        !            66:        return(1);
        !            67: }
        !            68: 
        !            69: mgattach()
        !            70: {
        !            71: }
        !            72: 
        !            73: /*
        !            74:  * comment
        !            75:  */
        !            76: mgopen(q, dev)
        !            77: register struct queue *q;
        !            78: register dev_t dev;
        !            79: {
        !            80:        register d, c;
        !            81: 
        !            82:        d = minor(dev);
        !            83:        MGADDR->csr |= CSR0 | CSR1;
        !            84:        if(d == 0){
        !            85:                if(mg.rq != NULL) goto bad;
        !            86:                c = MGADDR->rbuf;
        !            87:                MGADDR->csr |= INTB;
        !            88:                mg.rq = q;
        !            89:        } else if(d == 1){
        !            90:                if(mg.wq != NULL) goto bad;
        !            91:                MGADDR->csr |= INTA;
        !            92:                mg.wq = WR(q);
        !            93:        } else {
        !            94:                goto bad;
        !            95:        }
        !            96:        q->ptr = (caddr_t) minor(dev);
        !            97:        WR(q)->ptr = (caddr_t) minor(dev);
        !            98:        return(1);
        !            99: bad:
        !           100:        return(0);
        !           101: }
        !           102: 
        !           103: /*
        !           104:  * close MG
        !           105:  */
        !           106: mgclose(q)
        !           107: register struct queue *q;
        !           108: {
        !           109:        int dev;
        !           110: 
        !           111:        dev = (int) q->ptr;
        !           112:        if(dev){
        !           113:                mg.wq = NULL;
        !           114:        } else {
        !           115:                MGADDR->csr &= (~INTB);
        !           116:                /* flush output */;
        !           117:                flushq(WR(q), 1);
        !           118:                mg.rq = NULL;
        !           119:        }
        !           120: }
        !           121: 
        !           122: /*
        !           123:  * DK receiver interrupt.
        !           124:  */
        !           125: mgrint(dev)
        !           126: {
        !           127:        register struct queue *q;
        !           128:        register struct block *bp;
        !           129:        register c;
        !           130: 
        !           131:        q = mg.rq;
        !           132: 
        !           133:        c = MGADDR->rbuf;
        !           134:        if(q == NULL) return;
        !           135:        if((q->flag & QFULL) == 0){
        !           136:                putd(q->next->qinfo->putp, q->next, c);
        !           137:        }
        !           138: }
        !           139: 
        !           140: /*
        !           141:  * MG put procedure
        !           142:  */
        !           143: mgoput(q, bp)
        !           144: register struct queue *q;
        !           145: register struct block *bp;
        !           146: {
        !           147:        int s, r, n;
        !           148: 
        !           149:        switch(bp->type){
        !           150:        case M_IOCTL:
        !           151:                bp->type = M_IOCNAK;
        !           152:                bp->wptr = bp->rptr;
        !           153:                qreply(q, bp);
        !           154:                return;
        !           155:        case M_FLUSH:
        !           156:                flushq(q, 0);
        !           157:                break;
        !           158:        case M_DATA:
        !           159:                putq(q, bp);
        !           160:                mgstart();
        !           161:                return;
        !           162:        default:
        !           163:                break;
        !           164:        }
        !           165:        freeb(bp);
        !           166: }
        !           167: 
        !           168: mgtint(dev)
        !           169: {
        !           170:        mg.busy = 0;
        !           171:        mgstart();
        !           172: }
        !           173: 
        !           174: mgstart()
        !           175: {
        !           176:        register c, s;
        !           177:        register struct block *bp;
        !           178: 
        !           179:        if(mg.wq == NULL) return;
        !           180: 
        !           181:        s = spl6();
        !           182:        if((mg.busy == 0) && mg.wq->count){
        !           183:                bp = getq(mg.wq);
        !           184:                switch(bp->type){
        !           185:                case M_DATA:
        !           186:                        MGADDR->wbuf = *bp->rptr++;
        !           187:                        mg.busy = 1;
        !           188:                        if(bp->rptr >= bp->wptr)
        !           189:                                freeb(bp);
        !           190:                        else
        !           191:                                putbq(mg.wq, bp);
        !           192:                        break;
        !           193:                default:
        !           194:                        freeb(bp);
        !           195:                        break;
        !           196:                }
        !           197:        }
        !           198:        splx(s);
        !           199: }
        !           200: #endif

unix.superglobalmegacorp.com

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