1 /* rk.c 4.2 81/03/15 */ 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 22 if (rk_off[io->i_boff] == -1 || 23 io->i_boff < 0 || io->i_boff > 7) 24 _stop("rk bad unit"); 25 io->i_boff = rk_off[io->i_boff] * NRKSECT*NRKTRK; 26 } 27 28 rkstrategy(io, func) 29 register struct iob *io; 30 { 31 register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]); 32 int com; 33 daddr_t bn; 34 short dn, cn, sn, tn; 35 int ubinfo; 36 37 ubinfo = ubasetup(io, 1); 38 bn = io->i_bn; 39 dn = io->i_unit; 40 cn = bn/(NRKSECT*NRKTRK); 41 sn = bn%NRKSECT; 42 tn = (bn / NRKSECT) % NRKTRK; 43 rkaddr->rkcs2 = dn; 44 rkaddr->rkcs1 = RK_CDT|RK_PACK|RK_GO; 45 rkwait(rkaddr); 46 rkaddr->rkda = sn | (tn << 8); 47 rkaddr->rkcyl = cn; 48 rkaddr->rkba = ubinfo; 49 rkaddr->rkwc = -(io->i_cc >> 1); 50 com = RK_CDT|((ubinfo>>16)&0x30)|RK_GO; 51 if (func == READ) 52 com |= RK_READ; 53 else 54 com |= RK_WRITE; 55 rkaddr->rkcs1 = com; 56 rkwait(rkaddr); 57 while ((rkaddr->rkds & RK_SVAL) == 0) 58 ; 59 ubafree(io, ubinfo); 60 if (rkaddr->rkcs1 & RK_CERR) { 61 printf("rk error: cyl %d trk %d sec %d cs1 %o cs2 %o err %o\n", 62 cn, tn, sn, rkaddr->rkcs1, rkaddr->rkcs2, rkaddr->rker); 63 rkaddr->rkcs1 = RK_DCLR|RK_GO; 64 rkwait(rkaddr); 65 return (-1); 66 } 67 return (io->i_cc); 68 } 69 70 rkwait(rkaddr) 71 register struct rkdevice *rkaddr; 72 { 73 74 while ((rkaddr->rkcs1 & RK_CRDY) == 0) 75 ; 76 } 77