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

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

unix.superglobalmegacorp.com

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