|
|
1.1 ! root 1: /* rk.c 4.4 81/07/25 */ ! 2: ! 3: /* ! 4: * RK611/RK07 ! 5: */ ! 6: ! 7: #include "../h/param.h" ! 8: #include "../h/rkreg.h" ! 9: #include "../h/inode.h" ! 10: #include "../h/pte.h" ! 11: #include "../h/ubareg.h" ! 12: #include "saio.h" ! 13: #include "savax.h" ! 14: ! 15: u_short rkstd[] = { 0777440 }; ! 16: short rk_off[] = { 0, 241, 0, -1, -1, -1, 393, -1 }; ! 17: ! 18: rkopen(io) ! 19: register struct iob *io; ! 20: { ! 21: register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]); ! 22: ! 23: if (rk_off[io->i_boff] == -1 || ! 24: io->i_boff < 0 || io->i_boff > 7) ! 25: _stop("rk bad unit"); ! 26: io->i_boff = rk_off[io->i_boff] * NRKSECT*NRKTRK; ! 27: rkaddr->rkcs2 = RKCS2_SCLR; ! 28: rkwait(rkaddr); ! 29: } ! 30: ! 31: rkstrategy(io, func) ! 32: register struct iob *io; ! 33: { ! 34: register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]); ! 35: int com; ! 36: daddr_t bn; ! 37: short dn, cn, sn, tn; ! 38: int ubinfo, errcnt = 0; ! 39: ! 40: retry: ! 41: ubinfo = ubasetup(io, 1); ! 42: bn = io->i_bn; ! 43: dn = io->i_unit; ! 44: cn = bn/(NRKSECT*NRKTRK); ! 45: sn = bn%NRKSECT; ! 46: tn = (bn / NRKSECT) % NRKTRK; ! 47: rkaddr->rkcs2 = dn; ! 48: rkaddr->rkcs1 = RK_CDT|RK_PACK|RK_GO; ! 49: rkwait(rkaddr); ! 50: rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO; ! 51: rkwait(rkaddr); ! 52: rkaddr->rkda = sn | (tn << 8); ! 53: rkaddr->rkcyl = cn; ! 54: rkaddr->rkba = ubinfo; ! 55: rkaddr->rkwc = -(io->i_cc >> 1); ! 56: com = RK_CDT|((ubinfo>>8)&0x300)|RK_GO; ! 57: if (func == READ) ! 58: com |= RK_READ; ! 59: else ! 60: com |= RK_WRITE; ! 61: rkaddr->rkcs1 = com; ! 62: rkwait(rkaddr); ! 63: while ((rkaddr->rkds & RKDS_SVAL) == 0) ! 64: ; ! 65: ubafree(io, ubinfo); ! 66: if (rkaddr->rkcs1 & RK_CERR) { ! 67: printf("rk error: (cyl,trk,sec)=(%d,%d,%d) cs2=%b er=%b\n", ! 68: cn, tn, sn, rkaddr->rkcs2, RKCS2_BITS, ! 69: rkaddr->rker, RKER_BITS); ! 70: rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO; ! 71: rkwait(rkaddr); ! 72: if (errcnt == 10) { ! 73: printf("rk: unrecovered error\n"); ! 74: return (-1); ! 75: } ! 76: errcnt++; ! 77: goto retry; ! 78: } ! 79: if (errcnt) ! 80: printf("rk: recovered by retry\n"); ! 81: return (io->i_cc); ! 82: } ! 83: ! 84: rkwait(rkaddr) ! 85: register struct rkdevice *rkaddr; ! 86: { ! 87: ! 88: while ((rkaddr->rkcs1 & RK_CRDY) == 0) ! 89: ; ! 90: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.