Annotation of researchv9/sys.vax/dev/ramtek.c, revision 1.1

1.1     ! root        1: /*     dr.c    4.10    82/05/18        */
        !             2: 
        !             3: #include "rtk.h"
        !             4: /*
        !             5:  * UNIBUS DR11-B driver for various graphical systems,.
        !             6:  * TS
        !             7:  */
        !             8: 
        !             9: #include "../h/param.h"
        !            10: #include "../h/systm.h"
        !            11: #include "../h/cpu.h"
        !            12: #include "../h/nexus.h"
        !            13: #include "../h/dk.h"
        !            14: #include "../h/buf.h"
        !            15: #include "../h/conf.h"
        !            16: #include "../h/dir.h"
        !            17: #include "../h/user.h"
        !            18: #include "../h/map.h"
        !            19: #include "../h/pte.h"
        !            20: #include "../h/mtpr.h"
        !            21: #include "../h/vm.h"
        !            22: #include "../h/ubavar.h"
        !            23: #include "../h/ubareg.h"
        !            24: #include "../h/cmap.h"
        !            25: 
        !            26: #include "../h/drreg.h"
        !            27: 
        !            28: #define        DR_GO   01
        !            29: #define        DR_FNCT1        02
        !            30: #define        DR_GIE  010
        !            31: #define        DR_IE   0100
        !            32: #define        DR_ATTN 0200
        !            33: #define DR_CYCLE       0400
        !            34: #define        DR_NEX  00400000
        !            35: #define        DR_GRY  04000
        !            36: #define        DR_GIR  020000
        !            37: #define        DR_ERROR        01000000
        !            38: 
        !            39: char label[] = "Change the size";
        !            40: int    rtkprobe(),rtkattach(),rtkdgo(),rtkintr();
        !            41: int    drstrategy(),drstart();
        !            42: struct uba_ctlr *rtkminfo[NRTK];
        !            43: struct uba_device *rtkdinfo[NRTK];
        !            44: struct uba_ctlr drctlr[NRTK];  /* rtkminfo points to this */
        !            45: u_short rtkstd[]       = { 0172466, 0};        /* used to be
        !            46: u_short        rtkstd[]        = { 0172410,0172430,0172450,0172470,0 }; */
        !            47: struct uba_driver rtkdriver =
        !            48:        { rtkprobe,0,rtkattach,rtkdgo,rtkstd,"rtk",rtkdinfo,"rtk",rtkminfo };
        !            49: 
        !            50: #define ui_open        ui_type
        !            51: struct buf     drbuf[NRTK];
        !            52: struct buf     drutab[NRTK];
        !            53: 
        !            54: /*ARGSUSED*/
        !            55: rtkprobe(reg)
        !            56: caddr_t reg;
        !            57: {
        !            58:        register int br,cvec;
        !            59: 
        !            60: #ifdef LINT
        !            61:        br = 0; cvec = br; br = cvec;
        !            62: #endif
        !            63: printf("rtkprobe entered.\n");
        !            64: 
        !            65: /* There seems to be no way to make this vile animal
        !            66:    interrupt, so we cheat...                           */
        !            67: 
        !            68:        br = 0x15;
        !            69:        cvec = 0210;
        !            70: }
        !            71: 
        !            72: rtkattach(ui)
        !            73: register struct uba_device *ui;
        !            74: {
        !            75:        register struct uba_ctlr *um;
        !            76:        register int unit;
        !            77: 
        !            78:        unit = ui->ui_unit;
        !            79: 
        !            80:        um = &drctlr[unit];
        !            81:        rtkminfo[unit] = um;
        !            82:        ui->ui_ctlr = unit;
        !            83:        ui->ui_mi = um;
        !            84:        um->um_driver = ui->ui_driver;
        !            85:        um->um_ctlr = unit;
        !            86:        um->um_ubanum = ui->ui_ubanum;
        !            87:        um->um_alive = 1;
        !            88:        um->um_intr = ui->ui_intr;
        !            89:        um->um_addr = ui->ui_addr;
        !            90:        um->um_hd = ui->ui_hd;
        !            91: }
        !            92: 
        !            93: rtkopen(dev)
        !            94: dev_t dev;
        !            95: {
        !            96:        register int unit;
        !            97: 
        !            98:        unit = minor(dev);
        !            99:        if((unit >= NRTK) || (rtkdinfo[unit]->ui_open)) {
        !           100:                u.u_error = ENXIO;
        !           101:                return;
        !           102:        }
        !           103:        rtkdinfo[unit]->ui_open++;
        !           104: }
        !           105: 
        !           106: rtkclose(dev)
        !           107: dev_t dev;
        !           108: {
        !           109:        register int unit;
        !           110: 
        !           111:        rtkdinfo[minor(dev)]->ui_open = 0;
        !           112: }
        !           113: 
        !           114: rtkread(dev)
        !           115: dev_t dev;
        !           116: {
        !           117:        register int unit = minor(dev);
        !           118: 
        !           119:        physio(drstrategy,&drbuf[unit],dev,B_READ,minphys);
        !           120: }
        !           121: 
        !           122: rtkwrite(dev)
        !           123: dev_t dev;
        !           124: {
        !           125:        register int unit = minor(dev);
        !           126: 
        !           127:        physio(drstrategy,&drbuf[unit],dev,B_WRITE,minphys);
        !           128: }
        !           129: 
        !           130: /*
        !           131:  * Due to the fact the drstrategy routine is called only by rtkread
        !           132:  * and rtkwrite via physio, there will only be one transaction in each
        !           133:  * DR11-B's queue at any time.  Therefore, one can just tack the given
        !           134:  * buffer header pointer on at the end of the queue, and call drstart.
        !           135:  */
        !           136: drstrategy(bp)
        !           137: register struct buf *bp;
        !           138: {
        !           139:        register struct uba_device *ui;
        !           140:        register struct uba_ctlr *um;
        !           141:        register struct buf *dp;
        !           142:        dev_t unit;
        !           143: 
        !           144:        spl5();
        !           145:        unit = minor(bp->b_dev);        /* chose a DR11-B */
        !           146:        ui = rtkdinfo[unit];
        !           147:        um = ui->ui_mi;         /* get ctlr ptr */
        !           148:        dp = &drutab[unit];
        !           149:        dp->b_actf = bp;
        !           150:        dp->b_actl = bp;
        !           151:        bp->av_forw = NULL;
        !           152:        um->um_tab.b_actf = dp;
        !           153:        um->um_tab.b_actl = dp;
        !           154: 
        !           155:        drstart(um);
        !           156:        spl0();
        !           157: }
        !           158: 
        !           159: drstart(um)
        !           160: register struct uba_ctlr *um;
        !           161: {
        !           162:        register struct buf *bp,*dp;
        !           163:        register struct drdevice *draddr;
        !           164:        int cmd;
        !           165: 
        !           166:        dp = um->um_tab.b_actf;
        !           167:        bp = dp->b_actf;
        !           168: 
        !           169:        um->um_tab.b_active++;
        !           170:        draddr = (struct drdevice *)um->um_addr;
        !           171:        draddr->drwc = -bp->b_bcount / sizeof (short);
        !           172:        if(bp->b_flags & B_READ)
        !           173:                cmd = DR_IE|DR_FNCT1;
        !           174:        else
        !           175:                cmd = DR_IE;
        !           176:        um->um_cmd = cmd|DR_GO;
        !           177:        draddr->drcs = cmd;
        !           178:        DELAY(10);
        !           179:        (void) ubago(rtkdinfo[minor(bp->b_dev)]);
        !           180: }
        !           181: 
        !           182: rtkioctl() {}
        !           183: drreset() {}
        !           184: rtkdgo(um)
        !           185: struct uba_ctlr *um;
        !           186: {
        !           187:        register struct drdevice *draddr = (struct drdevice *)um->um_addr;
        !           188: 
        !           189:        draddr->drba = um->um_ubinfo;
        !           190:        draddr->drcs = um->um_cmd|((um->um_ubinfo>>12)&0x30);
        !           191: }
        !           192: rtkintr(dr11)
        !           193: register dr11;
        !           194: {
        !           195:        register struct buf *bp,*dp;
        !           196:        register struct drdevice *draddr;
        !           197:        register struct uba_ctlr *um;
        !           198: 
        !           199:        um = rtkminfo[dr11];
        !           200: 
        !           201:        if(um->um_tab.b_active == 0)
        !           202:                return;
        !           203: 
        !           204:        dp = um->um_tab.b_actf;
        !           205:        bp = dp->b_actf;
        !           206:        draddr = (struct drdevice *)um->um_addr;
        !           207: 
        !           208:        if((draddr->drcs&0100000) && draddr->drwc && (draddr->drba == 0)) {
        !           209:                draddr->drcs = um->um_cmd|(((um->um_ubinfo>>12)+1)&0x30);
        !           210:                return;
        !           211:        }
        !           212: 
        !           213:        um->um_tab.b_active = 0;
        !           214:        um->um_tab.b_errcnt = 0;
        !           215:        um->um_tab.b_actf = dp->b_forw;
        !           216:        dp->b_errcnt = 0;
        !           217:        dp->b_active = 0;
        !           218:        bp->b_resid = (-draddr->drwc * sizeof(short));
        !           219:        ubadone(um);
        !           220:        iodone(bp);
        !           221: }

unix.superglobalmegacorp.com

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