|
|
1.1 ! root 1: /* hk.c 4.1 11/9/80 */ ! 2: ! 3: /* ! 4: * RK7 disk driver, standalone version ! 5: */ ! 6: ! 7: #include "../h/param.h" ! 8: #include "../h/inode.h" ! 9: #include "../h/pte.h" ! 10: #include "../h/uba.h" ! 11: #include "saio.h" ! 12: ! 13: #define RK7ADDR ((struct rk7_regs *)(PHYSUMEM - 0160000 + 0177440)) ! 14: #define FORMAT_22 0 ! 15: #define RESET 0102000 ! 16: #define WCOM 022 ! 17: #define RCOM 020 ! 18: #define RK07 02000 ! 19: #define GO 01 ! 20: #define RELEASE 010 ! 21: #define CTLRDY 0200 ! 22: #define PACKAK 000003 /* Pack Acknowledge */ ! 23: ! 24: ! 25: struct rk7_regs ! 26: { ! 27: short rk7cs1; ! 28: short rk7wc; ! 29: unsigned short rk7ba; ! 30: short rk7da; ! 31: short rk7cs2; ! 32: short rk7ds; ! 33: short rk7er; ! 34: short rk7asof; ! 35: short rk7dc; ! 36: short rk7null; ! 37: short rk7db; ! 38: short rk7mr1; ! 39: short rk7ecps; ! 40: short rk7ecpt; ! 41: short rk7mr2; ! 42: short rk7mr3; ! 43: }; ! 44: ! 45: rk7strategy(io, func) ! 46: register struct iob *io; ! 47: { ! 48: register short com; ! 49: daddr_t bn; ! 50: short dn, cn, sn, tn; ! 51: int ubinfo; ! 52: ! 53: ubinfo = ubasetup( io, 1 ); ! 54: bn = io->i_bn; ! 55: dn = io->i_unit; ! 56: cn = bn/66; ! 57: sn = bn%22; ! 58: tn = (bn / 22) % 3; ! 59: ! 60: RK7ADDR -> rk7cs2 = dn; ! 61: RK7ADDR -> rk7cs1 = PACKAK | RK07; ! 62: while((com = RK7ADDR->rk7cs1) & 01); ! 63: ! 64: RK7ADDR -> rk7da = sn | (tn << 8); ! 65: RK7ADDR -> rk7dc = cn; ! 66: RK7ADDR->rk7ba = ubinfo; ! 67: RK7ADDR->rk7wc = -(io->i_cc >> 1); ! 68: ! 69: com = ((ubinfo & 0x30000) >> 8 ) | RK07 | GO | ( FORMAT_22<< 12); ! 70: if(func == READ) ! 71: com |= RCOM; else ! 72: com |= WCOM; ! 73: RK7ADDR->rk7cs1 = com; ! 74: ! 75: while (((com = RK7ADDR->rk7cs1) & CTLRDY) == 0); ! 76: while(RK7ADDR->rk7ds >= 0); ! 77: ! 78: ubafree (ubinfo); ! 79: if (RK7ADDR->rk7cs1 < 0) { /* error bit */ ! 80: printf ("RK07 error: unit %d, cyl %d, trk %d, sect %d, ", ! 81: io->i_unit, cn, tn, sn); ! 82: printf ("cs1 %X, cs2 %X, err %X\n", ! 83: RK7ADDR->rk7cs1, RK7ADDR->rk7cs2, RK7ADDR->rk7er); ! 84: ! 85: RK7ADDR->rk7cs1 = RESET|GO; ! 86: while(((com = RK7ADDR->rk7cs1)&CTLRDY) == 0); ! 87: return (-1); ! 88: } ! 89: return (io->i_cc); ! 90: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.