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 } 91