Annotation of researchv10no/sys/io/om.c, revision 1.1

1.1     ! root        1: /*% cyntax -c -DKERNEL % && cc -c -DKERNEL %
        !             2:  * Metheus 3610 driver via dr11-w for 9Vr2
        !             3:  */
        !             4: #include "sys/param.h"
        !             5: #include "sys/conf.h"
        !             6: #include "sys/user.h"
        !             7: #include "sys/buf.h"
        !             8: #include "sys/ubaddr.h"
        !             9: #include "sys/om.h"
        !            10: #define        OMTIMEOUT       15      /* seconds */
        !            11: int omopen(), omclose(), omread(), omwrite(), omioctl();
        !            12: struct cdevsw omcdev=cdinit(omopen, omclose, omread, omwrite, nodev);
        !            13: int omcnt;                     /* defined in conf */
        !            14: extern struct ubaddr omaddr[];         /* defined in conf */
        !            15: #define        OPEN    1               /* somebody has the device open */
        !            16: #define        RUNNING 2               /* dma in progress */
        !            17: #define        LATE    4               /* dma ready to time out */
        !            18: #define        NOTIME  8               /* don't bother with timeout */
        !            19: int omtiming;                  /* timeout exists */
        !            20: /*
        !            21:  * dr11-w hardware registers
        !            22:  */
        !            23: struct omreg{
        !            24:        short wc;
        !            25:        short addr;
        !            26:        short csr;
        !            27:        short data;
        !            28: };
        !            29: /*
        !            30:  * csr bits
        !            31:  */
        !            32: #define        ERROR   0100000
        !            33: #define        ATTN    020000
        !            34: #define        READY   0200
        !            35: #define        IENABLE 0100
        !            36: #define        XMEM    060
        !            37: #define        xmem(a) (((a)>>12)&XMEM)
        !            38: #define        WAKEUP  010
        !            39: #define        READ    02
        !            40: #define        GO      01
        !            41: int omtimeout();
        !            42: omopen(dev, flags){
        !            43:        register d=minor(dev);
        !            44:        register struct om *p=&om[d];
        !            45:        if(d>=omcnt
        !            46:        || p->flag&OPEN){
        !            47:                u.u_error=ENODEV;
        !            48:                return;
        !            49:        }
        !            50:        if((p->reg=(struct omreg *)ubaddr(&omaddr[d]))==0
        !            51:        || ubbadaddr(omaddr[d].ubno, (caddr_t)&p->reg->csr, sizeof(short))){
        !            52:                printf("om%d absent\n", d);
        !            53:                u.u_error=ENODEV;
        !            54:                return;
        !            55:        }
        !            56:        p->flag|=OPEN;
        !            57:        if(omtiming==0) {
        !            58:                omtiming=1;
        !            59:                timeout(omtimeout, (caddr_t)0, OMTIMEOUT*HZ);
        !            60:        }
        !            61: }
        !            62: omclose(dev){
        !            63:        om[minor(dev)].flag&=~OPEN;
        !            64: }
        !            65: omstrategy(bp)
        !            66: struct buf *bp;
        !            67: {
        !            68:        register d=minor(bp->b_dev), csr, pri;
        !            69:        register struct om *p=&om[d];
        !            70:        register struct omreg *omreg;
        !            71:        register uaddr_t ubad;
        !            72:        if(bp->b_bcount&1){
        !            73:                bp->b_flags|=B_ERROR;
        !            74:                iodone(bp);
        !            75:                return;
        !            76:        }
        !            77:        p->ubm=ubmbuf(omaddr[d].ubno, bp, UBDP|USLP);
        !            78:        ubad=ubadbuf(omaddr[d].ubno, bp, p->ubm);
        !            79:        pri=spl5();
        !            80:        omreg=p->reg;
        !            81:        omreg->wc=-(bp->b_bcount>>1);
        !            82:        omreg->addr=ubad;
        !            83:        csr=IENABLE|xmem(ubad);
        !            84:        if(bp->b_flags&B_READ) csr|=READ;
        !            85:        omreg->csr=csr;
        !            86:        omreg->csr=csr|GO;
        !            87:        if ((bp->b_flags & B_READ) == 0) {
        !            88:                p->flag |= RUNNING;
        !            89:                splx(pri);
        !            90:                return;
        !            91:        }
        !            92:        /*
        !            93:         * reading: no timeout (might wait forever for mouse data)
        !            94:         * hence must allow signals
        !            95:         * hence do our own sleep
        !            96:         */
        !            97:        p->flag |= (RUNNING|NOTIME);
        !            98:        if (tsleep((caddr_t)bp, PZERO+1, 0) != TS_OK) {
        !            99:                /* signal: tear down by hand */
        !           100:                omreg->csr = ATTN|WAKEUP|IENABLE;
        !           101:                bp->b_flags |= B_ERROR;
        !           102:                ubmfree(omaddr[d].ubno, p->ubm);
        !           103:                iodone(bp);
        !           104:                p->flag &=~ (RUNNING|NOTIME|LATE);
        !           105:        }
        !           106:        splx(pri);
        !           107: }
        !           108: omread(dev){
        !           109:        physio(omstrategy, &om[minor(dev)].buf, dev, B_READ, minphys);
        !           110: }
        !           111: omwrite(dev){
        !           112:        physio(omstrategy, &om[minor(dev)].buf, dev, B_WRITE, minphys);
        !           113: }
        !           114: om0int(d){
        !           115:        register struct buf *bp;
        !           116:        register struct om *p=&om[d];
        !           117:        register struct omreg *omreg=p->reg;
        !           118:        register csr=omreg->csr;
        !           119:        if(p->flag&RUNNING && csr&(READY|ATTN)){
        !           120:                omreg->csr=0;
        !           121:                bp=&p->buf;
        !           122:                if(csr&ERROR)
        !           123:                        bp->b_flags|=B_ERROR;
        !           124:                bp->b_resid=(-omreg->wc)<<1;
        !           125:                ubmfree(omaddr[d].ubno, p->ubm);
        !           126:                iodone(bp);
        !           127:                p->flag&=~(RUNNING|NOTIME|LATE);
        !           128:        }
        !           129: }
        !           130: omtimeout(){
        !           131:        register struct om *p, *ep;
        !           132:        register int s;
        !           133:        ep=&om[omcnt];
        !           134:        s=spl5();
        !           135:        for(p=&om[0];p!=ep;p++) if((p->flag&(RUNNING|NOTIME))==RUNNING){
        !           136:                if((p->flag&LATE)==0)
        !           137:                        p->flag|=LATE;
        !           138:                else {
        !           139:                        p->reg->csr=ATTN|WAKEUP|IENABLE;
        !           140:                        ubmfree(omaddr[p-om].ubno, p->ubm);
        !           141:                        p->buf.b_flags|=B_ERROR;
        !           142:                        iodone(&p->buf);
        !           143:                        p->flag&=~(RUNNING|LATE);
        !           144:                }
        !           145:        }
        !           146:        splx(s);
        !           147:        timeout(omtimeout, (caddr_t)0, OMTIMEOUT*HZ);
        !           148: }

unix.superglobalmegacorp.com

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