1*7446Sroot /* rk.c 4.5 82/07/15 */ 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" 12*7446Sroot #include "../h/fs.h" 131915Swnj #include "saio.h" 143263Swnj #include "savax.h" 151915Swnj 163263Swnj u_short rkstd[] = { 0777440 }; 173263Swnj short rk_off[] = { 0, 241, 0, -1, -1, -1, 393, -1 }; 181915Swnj 191915Swnj rkopen(io) 203263Swnj register struct iob *io; 211915Swnj { 223349Swnj register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]); 231915Swnj 243263Swnj if (rk_off[io->i_boff] == -1 || 251915Swnj io->i_boff < 0 || io->i_boff > 7) 261915Swnj _stop("rk bad unit"); 273263Swnj io->i_boff = rk_off[io->i_boff] * NRKSECT*NRKTRK; 283349Swnj rkaddr->rkcs2 = RKCS2_SCLR; 293349Swnj rkwait(rkaddr); 301915Swnj } 311915Swnj 321915Swnj rkstrategy(io, func) 333263Swnj register struct iob *io; 341915Swnj { 353263Swnj register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]); 363263Swnj int com; 371915Swnj daddr_t bn; 381915Swnj short dn, cn, sn, tn; 393349Swnj int ubinfo, errcnt = 0; 401915Swnj 413349Swnj retry: 421915Swnj ubinfo = ubasetup(io, 1); 431915Swnj bn = io->i_bn; 441915Swnj dn = io->i_unit; 453263Swnj cn = bn/(NRKSECT*NRKTRK); 463263Swnj sn = bn%NRKSECT; 473263Swnj tn = (bn / NRKSECT) % NRKTRK; 483263Swnj rkaddr->rkcs2 = dn; 493263Swnj rkaddr->rkcs1 = RK_CDT|RK_PACK|RK_GO; 503263Swnj rkwait(rkaddr); 513349Swnj rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO; 523349Swnj rkwait(rkaddr); 533263Swnj rkaddr->rkda = sn | (tn << 8); 543263Swnj rkaddr->rkcyl = cn; 553263Swnj rkaddr->rkba = ubinfo; 563263Swnj rkaddr->rkwc = -(io->i_cc >> 1); 574038Swnj com = RK_CDT|((ubinfo>>8)&0x300)|RK_GO; 583263Swnj if (func == READ) 593263Swnj com |= RK_READ; 603263Swnj else 613263Swnj com |= RK_WRITE; 623263Swnj rkaddr->rkcs1 = com; 633263Swnj rkwait(rkaddr); 643349Swnj while ((rkaddr->rkds & RKDS_SVAL) == 0) 651915Swnj ; 663263Swnj ubafree(io, ubinfo); 673263Swnj if (rkaddr->rkcs1 & RK_CERR) { 683349Swnj printf("rk error: (cyl,trk,sec)=(%d,%d,%d) cs2=%b er=%b\n", 693349Swnj cn, tn, sn, rkaddr->rkcs2, RKCS2_BITS, 703349Swnj rkaddr->rker, RKER_BITS); 713349Swnj rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO; 723263Swnj rkwait(rkaddr); 733349Swnj if (errcnt == 10) { 743349Swnj printf("rk: unrecovered error\n"); 753349Swnj return (-1); 763349Swnj } 773349Swnj errcnt++; 783349Swnj goto retry; 791915Swnj } 803349Swnj if (errcnt) 813349Swnj printf("rk: recovered by retry\n"); 821915Swnj return (io->i_cc); 831915Swnj } 843263Swnj 853263Swnj rkwait(rkaddr) 863263Swnj register struct rkdevice *rkaddr; 873263Swnj { 883263Swnj 893263Swnj while ((rkaddr->rkcs1 & RK_CRDY) == 0) 903263Swnj ; 913263Swnj } 92