Annotation of researchv10dc/sys/io/mg.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * DR11C for Mergenthaler 202
                      3:  */
                      4: #include "sys/param.h"
                      5: #include "sys/conf.h"
                      6: #include "sys/stream.h"
                      7: #include "sys/ubaddr.h"
                      8: #include "sys/mg.h"
                      9: 
                     10: /*
                     11:  * hardware
                     12:  */
                     13: struct device {
                     14:        u_short csr;
                     15:        u_short wbuf;
                     16:        u_short rbuf;
                     17: };
                     18: 
                     19: #define CSR0 1
                     20: #define CSR1 2
                     21: #define REQA 0200
                     22: #define REQB 0100000
                     23: #define INTA 0100
                     24: #define INTB 040
                     25: 
                     26: /*
                     27:  * stream glue
                     28:  */
                     29: long mgopen();
                     30: int nodev(), mgclose(), mgoput();
                     31: 
                     32: static struct qinit mgrinit = {
                     33:        nodev, NULL, mgopen, mgclose, 0, 0
                     34: };
                     35: static struct qinit mgwinit = {
                     36:        mgoput, NULL, mgopen, mgclose, 200, 100
                     37: };
                     38: struct streamtab mginfo = {
                     39:        &mgrinit, &mgwinit
                     40: };
                     41: 
                     42: /*
                     43:  * config glue
                     44:  */
                     45: extern struct mg mg[];                 /* one per device */
                     46: extern struct ubaddr mgaddr[];         /* one per device */
                     47: extern int mgcnt;                      /* one per device or what? */
                     48: struct cdevsw mgcdev = cstrinit(&mginfo);
                     49: 
                     50: long
                     51: mgopen(q, d)
                     52: register struct queue *q;
                     53: {
                     54:        register struct mg *mp;
                     55:        register dev, s;
                     56: 
                     57:        if((dev = (minor(d) >> 1)) >= mgcnt)
                     58:                return 0;
                     59:        mp = &mg[dev];
                     60:        if((mp->addr = (struct device *)ubaddr(&mgaddr[dev])) == 0
                     61:          || ubbadaddr(mgaddr[dev].ubno, mp->addr, sizeof(u_short))) {
                     62:                printf("mg%d absent\n", d);
                     63:                return 0;
                     64:        }
                     65:        mp->addr->csr |= CSR0 | CSR1;
                     66:        if(d & 01) {
                     67:                if(mp->wq != NULL)
                     68:                        return 0;
                     69:                mp->addr->csr |= INTA;
                     70:                mp->wq = WR(q);
                     71:        }
                     72:        else {
                     73:                if(mp->rq != NULL)
                     74:                        return 0;
                     75:                s = mp->addr->rbuf;
                     76:                mp->addr->csr |= INTB;
                     77:                mp->rq = q;
                     78:        }
                     79:        WR(q)->ptr = q->ptr = (caddr_t) minor(d);
                     80:        return 1;
                     81: }
                     82: 
                     83: mgclose(q)
                     84: register struct queue *q;
                     85: {
                     86:        register struct mg *mp = &mg[((int)q->ptr) >> 1];
                     87: 
                     88:        if(((int)q->ptr) & 01) {
                     89:                mp->wq = NULL;
                     90:        }
                     91:        else {
                     92:                mp->addr->csr &= (~INTB);
                     93:                flushq(WR(q), 1);
                     94:                mp->rq = NULL;
                     95:        }
                     96: }
                     97: 
                     98: mg1int(dev)
                     99: {
                    100:        register struct mg *mp = &mg[dev];
                    101:        register c;
                    102: 
                    103:        c = mp->addr->rbuf;
                    104:        if(mp->rq && (mp->rq->flag & QFULL) == 0)
                    105:                putd(mp->rq->next->qinfo->putp, mp->rq->next, c);
                    106: }
                    107: 
                    108: mg0int(dev)
                    109: {
                    110:        register struct mg *mp = &mg[dev];
                    111: 
                    112:        mp->busy = 0;
                    113:        mgstart(mp);
                    114: }
                    115: 
                    116: mgoput(q, bp)
                    117: register struct queue *q;
                    118: register struct block *bp;
                    119: {
                    120:        switch(bp->type) {
                    121: 
                    122:        case M_IOCTL:
                    123:                bp->type = M_IOCNAK;
                    124:                bp->wptr = bp->rptr;
                    125:                qreply(q, bp);
                    126:                return;
                    127: 
                    128:        case M_FLUSH:
                    129:                flushq(q, 0);
                    130:                break;
                    131: 
                    132:        case M_DATA:
                    133:                putq(q, bp);
                    134:                mgstart(&mg[((int)q->ptr) >> 1]);
                    135:                return;
                    136: 
                    137:        default:
                    138:                break;
                    139:        }
                    140:        freeb(bp);
                    141: }
                    142: 
                    143: mgstart(mp)
                    144: register struct mg *mp;
                    145: {
                    146:        register struct block *bp;
                    147:        register s;
                    148: 
                    149:        if(mp->wq == NULL)
                    150:                return;
                    151:        s = spl6();
                    152:        if((mp->busy == 0) && mp->wq->count) {
                    153:                bp = getq(mp->wq);
                    154:                switch(bp->type) {
                    155: 
                    156:                case M_DATA:
                    157:                        mp->addr->wbuf = *bp->rptr++;
                    158:                        mp->busy = 1;
                    159:                        if(bp->rptr >= bp->wptr)
                    160:                                freeb(bp);
                    161:                        else
                    162:                                putbq(mp->wq, bp);
                    163:                        break;
                    164: 
                    165:                default:
                    166:                        freeb(bp);
                    167:                        break;
                    168:                }
                    169:        }
                    170:        splx(s);
                    171: }

unix.superglobalmegacorp.com

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