|
|
1.1 ! root 1: /* ! 2: * RK7 disk driver ! 3: */ ! 4: ! 5: #include "../h/param.h" ! 6: #include "../h/systm.h" ! 7: #include "../h/buf.h" ! 8: #include "../h/conf.h" ! 9: #include "../h/dir.h" ! 10: #include "../h/user.h" ! 11: #include "../h/uba.h" ! 12: ! 13: #define RK7ADDR ((struct rk7_regs *)( UBA0_DEV + 0177440)) ! 14: #define ERR_CNT 10 ! 15: #define NRK7 8 ! 16: #define NRK7BLK 53790 ! 17: #define FORMAT_22 0 ! 18: #define RESET 0102000 ! 19: #define WCOM 022 ! 20: #define RCOM 020 ! 21: #define RK07 02000 ! 22: #define GO 01 ! 23: #define RELEASE 010 ! 24: #define IENABLE 0000100 ! 25: #define CTLRDY 0200 ! 26: #define PACKAK 000003 /* Pack Acknowledge */ ! 27: ! 28: ! 29: struct rk7_regs ! 30: { ! 31: short rk7cs1; ! 32: short rk7wc; ! 33: unsigned short rk7ba; ! 34: short rk7da; ! 35: short rk7cs2; ! 36: short rk7ds; ! 37: short rk7er; ! 38: short rk7asof; ! 39: short rk7dc; ! 40: short rk7null; ! 41: short rk7db; ! 42: short rk7mr1; ! 43: short rk7ecps; ! 44: short rk7ecpt; ! 45: short rk7mr2; ! 46: short rk7mr3; ! 47: }; ! 48: ! 49: struct buf rk7tab; ! 50: struct buf rrk7buf; ! 51: ! 52: int rk7_ubinfo; ! 53: ! 54: rk7strategy(bp) ! 55: register struct buf *bp; ! 56: { ! 57: ! 58: if (bp->b_blkno >= NRK7BLK) { ! 59: bp->b_flags |= B_ERROR; ! 60: iodone(bp); ! 61: return; ! 62: } ! 63: bp->av_forw = (struct buf *)NULL; ! 64: spl5(); ! 65: if(rk7tab.b_actf == NULL) ! 66: rk7tab.b_actf = bp; ! 67: else ! 68: rk7tab.b_actl->av_forw = bp; ! 69: rk7tab.b_actl = bp; ! 70: if(rk7tab.b_active == NULL) ! 71: rk7start(); ! 72: spl0(); ! 73: } ! 74: ! 75: rk7start() ! 76: { ! 77: register struct buf *bp; ! 78: register short com; ! 79: daddr_t bn; ! 80: short dn, cn, sn, tn; ! 81: ! 82: if ((bp = rk7tab.b_actf) == NULL) ! 83: return; ! 84: rk7tab.b_active++; ! 85: rk7_ubinfo = ubasetup( bp, 1 ); ! 86: bn = bp->b_blkno; ! 87: dn = minor(bp->b_dev); ! 88: cn = bn/66; ! 89: sn = bn%22; ! 90: tn = (bn / 22) % 3; ! 91: /* ! 92: printf("in start bn = %d dn = %d cn = %d sn = %d tn = %d\n",bn,dn,cn,sn,tn); ! 93: */ ! 94: RK7ADDR -> rk7cs2 = dn; ! 95: RK7ADDR -> rk7cs1 = PACKAK | RK07; ! 96: while(RK7ADDR->rk7cs1 & 01); ! 97: ! 98: RK7ADDR -> rk7da = sn | (tn << 8); ! 99: RK7ADDR -> rk7dc = cn; ! 100: RK7ADDR->rk7ba = rk7_ubinfo; ! 101: RK7ADDR->rk7wc = -(bp->b_bcount>>1); ! 102: ! 103: com = ((rk7_ubinfo & 0x30000) >> 8 ) | IENABLE | RK07 | GO | ( FORMAT_22<< 12); ! 104: if(bp->b_flags & B_READ) ! 105: com |= RCOM; else ! 106: com |= WCOM; ! 107: RK7ADDR->rk7cs1 = com; ! 108: /* ! 109: printf("cs1 in start = %d(bit15) %o(remainder)\n",(RK7ADDR->rk7cs1>>15)&01,RK7ADDR->rk7cs1 & 077777); ! 110: */ ! 111: } ! 112: ! 113: rk7intr() ! 114: { ! 115: register struct buf *bp; ! 116: ! 117: ! 118: /* ! 119: printf("in intr->rk7ds = %d(bit 15) %o(remainder)",(RK7ADDR->rk7ds>>15)&01,RK7ADDR->rk7ds & 077777); ! 120: printf("cs1 = %d(bit 15) %o(remainder)\n",(RK7ADDR->rk7cs1>>15)&01,RK7ADDR->rk7cs1 & 077777); ! 121: */ ! 122: if (rk7tab.b_active == NULL) ! 123: return; ! 124: bp = rk7tab.b_actf; ! 125: rk7tab.b_active = NULL; ! 126: while(RK7ADDR->rk7ds >= 0); ! 127: /* ! 128: printf("rk7ds = %o(bit 15) %o\n",(RK7ADDR -> rk7ds >> 15) & 01,RK7ADDR -> rk7ds & 077777); ! 129: printf("after ready wait, cs1 = %d (bit 15) %o (remainder)\n",(RK7ADDR->rk7cs1>>15)&01,RK7ADDR->rk7cs1&077777); ! 130: */ ! 131: ! 132: if (RK7ADDR->rk7cs1 < 0) { /* error bit */ ! 133: deverror(bp, RK7ADDR->rk7er, RK7ADDR->rk7cs2); ! 134: printf("err reg = %o octal\n",RK7ADDR->rk7er); ! 135: RK7ADDR->rk7cs1 = RESET|GO; ! 136: while((RK7ADDR->rk7cs1&CTLRDY) == 0) ! 137: ; ! 138: if (++rk7tab.b_errcnt <= ERR_CNT) { ! 139: ubafree(rk7_ubinfo); ! 140: rk7start(); ! 141: return; ! 142: } ! 143: bp->b_flags |= B_ERROR; ! 144: } ! 145: rk7tab.b_errcnt = 0; ! 146: rk7tab.b_actf = bp->av_forw; ! 147: bp->b_resid = 0; ! 148: ubafree(rk7_ubinfo); ! 149: iodone(bp); ! 150: RK7ADDR->rk7cs2 |= RELEASE; ! 151: RK7ADDR->rk7cs1 = GO; ! 152: rk7start(); ! 153: } ! 154: ! 155: rk7read(dev) ! 156: dev_t dev; ! 157: { ! 158: ! 159: physio(rk7strategy, &rrk7buf, dev, B_READ, minphys); ! 160: } ! 161: ! 162: rk7write(dev) ! 163: dev_t dev; ! 164: { ! 165: ! 166: physio(rk7strategy, &rrk7buf, dev, B_WRITE, minphys); ! 167: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.