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