1*4038Swnj /* rk.c 4.4 81/07/25 */ 21915Swnj 31915Swnj /* 43263Swnj * RK611/RK07 51915Swnj */ 61915Swnj 71915Swnj #include "../h/param.h" 83263Swnj #include "../h/rkreg.h" 91915Swnj #include "../h/inode.h" 101915Swnj #include "../h/pte.h" 113263Swnj #include "../h/ubareg.h" 121915Swnj #include "saio.h" 133263Swnj #include "savax.h" 141915Swnj 153263Swnj u_short rkstd[] = { 0777440 }; 163263Swnj short rk_off[] = { 0, 241, 0, -1, -1, -1, 393, -1 }; 171915Swnj 181915Swnj rkopen(io) 193263Swnj register struct iob *io; 201915Swnj { 213349Swnj register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]); 221915Swnj 233263Swnj if (rk_off[io->i_boff] == -1 || 241915Swnj io->i_boff < 0 || io->i_boff > 7) 251915Swnj _stop("rk bad unit"); 263263Swnj io->i_boff = rk_off[io->i_boff] * NRKSECT*NRKTRK; 273349Swnj rkaddr->rkcs2 = RKCS2_SCLR; 283349Swnj rkwait(rkaddr); 291915Swnj } 301915Swnj 311915Swnj rkstrategy(io, func) 323263Swnj register struct iob *io; 331915Swnj { 343263Swnj register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]); 353263Swnj int com; 361915Swnj daddr_t bn; 371915Swnj short dn, cn, sn, tn; 383349Swnj int ubinfo, errcnt = 0; 391915Swnj 403349Swnj retry: 411915Swnj ubinfo = ubasetup(io, 1); 421915Swnj bn = io->i_bn; 431915Swnj dn = io->i_unit; 443263Swnj cn = bn/(NRKSECT*NRKTRK); 453263Swnj sn = bn%NRKSECT; 463263Swnj tn = (bn / NRKSECT) % NRKTRK; 473263Swnj rkaddr->rkcs2 = dn; 483263Swnj rkaddr->rkcs1 = RK_CDT|RK_PACK|RK_GO; 493263Swnj rkwait(rkaddr); 503349Swnj rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO; 513349Swnj rkwait(rkaddr); 523263Swnj rkaddr->rkda = sn | (tn << 8); 533263Swnj rkaddr->rkcyl = cn; 543263Swnj rkaddr->rkba = ubinfo; 553263Swnj rkaddr->rkwc = -(io->i_cc >> 1); 56*4038Swnj com = RK_CDT|((ubinfo>>8)&0x300)|RK_GO; 573263Swnj if (func == READ) 583263Swnj com |= RK_READ; 593263Swnj else 603263Swnj com |= RK_WRITE; 613263Swnj rkaddr->rkcs1 = com; 623263Swnj rkwait(rkaddr); 633349Swnj while ((rkaddr->rkds & RKDS_SVAL) == 0) 641915Swnj ; 653263Swnj ubafree(io, ubinfo); 663263Swnj if (rkaddr->rkcs1 & RK_CERR) { 673349Swnj printf("rk error: (cyl,trk,sec)=(%d,%d,%d) cs2=%b er=%b\n", 683349Swnj cn, tn, sn, rkaddr->rkcs2, RKCS2_BITS, 693349Swnj rkaddr->rker, RKER_BITS); 703349Swnj rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO; 713263Swnj rkwait(rkaddr); 723349Swnj if (errcnt == 10) { 733349Swnj printf("rk: unrecovered error\n"); 743349Swnj return (-1); 753349Swnj } 763349Swnj errcnt++; 773349Swnj goto retry; 781915Swnj } 793349Swnj if (errcnt) 803349Swnj printf("rk: recovered by retry\n"); 811915Swnj return (io->i_cc); 821915Swnj } 833263Swnj 843263Swnj rkwait(rkaddr) 853263Swnj register struct rkdevice *rkaddr; 863263Swnj { 873263Swnj 883263Swnj while ((rkaddr->rkcs1 & RK_CRDY) == 0) 893263Swnj ; 903263Swnj } 91