|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.