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