Annotation of researchv8dc/sys/dev/ramtek.c, revision 1.1.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.