1*3263Swnj /* rk.c 4.2 81/03/15 */ 21915Swnj 31915Swnj /* 4*3263Swnj * RK611/RK07 51915Swnj */ 61915Swnj 71915Swnj #include "../h/param.h" 8*3263Swnj #include "../h/rkreg.h" 91915Swnj #include "../h/inode.h" 101915Swnj #include "../h/pte.h" 11*3263Swnj #include "../h/ubareg.h" 121915Swnj #include "saio.h" 13*3263Swnj #include "savax.h" 141915Swnj 15*3263Swnj u_short rkstd[] = { 0777440 }; 16*3263Swnj short rk_off[] = { 0, 241, 0, -1, -1, -1, 393, -1 }; 171915Swnj 181915Swnj rkopen(io) 19*3263Swnj register struct iob *io; 201915Swnj { 211915Swnj 22*3263Swnj if (rk_off[io->i_boff] == -1 || 231915Swnj io->i_boff < 0 || io->i_boff > 7) 241915Swnj _stop("rk bad unit"); 25*3263Swnj io->i_boff = rk_off[io->i_boff] * NRKSECT*NRKTRK; 261915Swnj } 271915Swnj 281915Swnj rkstrategy(io, func) 29*3263Swnj register struct iob *io; 301915Swnj { 31*3263Swnj register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]); 32*3263Swnj int com; 331915Swnj daddr_t bn; 341915Swnj short dn, cn, sn, tn; 351915Swnj int ubinfo; 361915Swnj 371915Swnj ubinfo = ubasetup(io, 1); 381915Swnj bn = io->i_bn; 391915Swnj dn = io->i_unit; 40*3263Swnj cn = bn/(NRKSECT*NRKTRK); 41*3263Swnj sn = bn%NRKSECT; 42*3263Swnj tn = (bn / NRKSECT) % NRKTRK; 43*3263Swnj rkaddr->rkcs2 = dn; 44*3263Swnj rkaddr->rkcs1 = RK_CDT|RK_PACK|RK_GO; 45*3263Swnj rkwait(rkaddr); 46*3263Swnj rkaddr->rkda = sn | (tn << 8); 47*3263Swnj rkaddr->rkcyl = cn; 48*3263Swnj rkaddr->rkba = ubinfo; 49*3263Swnj rkaddr->rkwc = -(io->i_cc >> 1); 50*3263Swnj com = RK_CDT|((ubinfo>>16)&0x30)|RK_GO; 51*3263Swnj if (func == READ) 52*3263Swnj com |= RK_READ; 53*3263Swnj else 54*3263Swnj com |= RK_WRITE; 55*3263Swnj rkaddr->rkcs1 = com; 56*3263Swnj rkwait(rkaddr); 57*3263Swnj while ((rkaddr->rkds & RK_SVAL) == 0) 581915Swnj ; 59*3263Swnj ubafree(io, ubinfo); 60*3263Swnj if (rkaddr->rkcs1 & RK_CERR) { 61*3263Swnj printf("rk error: cyl %d trk %d sec %d cs1 %o cs2 %o err %o\n", 62*3263Swnj cn, tn, sn, rkaddr->rkcs1, rkaddr->rkcs2, rkaddr->rker); 63*3263Swnj rkaddr->rkcs1 = RK_DCLR|RK_GO; 64*3263Swnj rkwait(rkaddr); 651915Swnj return (-1); 661915Swnj } 671915Swnj return (io->i_cc); 681915Swnj } 69*3263Swnj 70*3263Swnj rkwait(rkaddr) 71*3263Swnj register struct rkdevice *rkaddr; 72*3263Swnj { 73*3263Swnj 74*3263Swnj while ((rkaddr->rkcs1 & RK_CRDY) == 0) 75*3263Swnj ; 76*3263Swnj } 77