1*10024Ssam /* rk.c 4.8 82/12/30 */ 21915Swnj 31915Swnj /* 43263Swnj * RK611/RK07 51915Swnj */ 69806Ssam #include "../machine/pte.h" 71915Swnj 81915Swnj #include "../h/param.h" 91915Swnj #include "../h/inode.h" 107446Sroot #include "../h/fs.h" 119186Ssam 129186Ssam #include "../vaxuba/ubareg.h" 139186Ssam #include "../vaxuba/rkreg.h" 149186Ssam 151915Swnj #include "saio.h" 163263Swnj #include "savax.h" 171915Swnj 183263Swnj u_short rkstd[] = { 0777440 }; 193263Swnj short rk_off[] = { 0, 241, 0, -1, -1, -1, 393, -1 }; 201915Swnj 211915Swnj rkopen(io) 223263Swnj register struct iob *io; 231915Swnj { 243349Swnj register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]); 251915Swnj 263263Swnj if (rk_off[io->i_boff] == -1 || 271915Swnj io->i_boff < 0 || io->i_boff > 7) 281915Swnj _stop("rk bad unit"); 293263Swnj io->i_boff = rk_off[io->i_boff] * NRKSECT*NRKTRK; 303349Swnj rkaddr->rkcs2 = RKCS2_SCLR; 313349Swnj rkwait(rkaddr); 321915Swnj } 331915Swnj 341915Swnj rkstrategy(io, func) 353263Swnj register struct iob *io; 361915Swnj { 373263Swnj register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]); 383263Swnj int com; 391915Swnj daddr_t bn; 401915Swnj short dn, cn, sn, tn; 413349Swnj int ubinfo, errcnt = 0; 421915Swnj 433349Swnj retry: 441915Swnj ubinfo = ubasetup(io, 1); 451915Swnj bn = io->i_bn; 461915Swnj dn = io->i_unit; 473263Swnj cn = bn/(NRKSECT*NRKTRK); 483263Swnj sn = bn%NRKSECT; 493263Swnj tn = (bn / NRKSECT) % NRKTRK; 503263Swnj rkaddr->rkcs2 = dn; 513263Swnj rkaddr->rkcs1 = RK_CDT|RK_PACK|RK_GO; 523263Swnj rkwait(rkaddr); 533349Swnj rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO; 543349Swnj rkwait(rkaddr); 553263Swnj rkaddr->rkda = sn | (tn << 8); 563263Swnj rkaddr->rkcyl = cn; 573263Swnj rkaddr->rkba = ubinfo; 583263Swnj rkaddr->rkwc = -(io->i_cc >> 1); 594038Swnj com = RK_CDT|((ubinfo>>8)&0x300)|RK_GO; 603263Swnj if (func == READ) 613263Swnj com |= RK_READ; 623263Swnj else 633263Swnj com |= RK_WRITE; 643263Swnj rkaddr->rkcs1 = com; 653263Swnj rkwait(rkaddr); 663349Swnj while ((rkaddr->rkds & RKDS_SVAL) == 0) 671915Swnj ; 683263Swnj ubafree(io, ubinfo); 693263Swnj if (rkaddr->rkcs1 & RK_CERR) { 703349Swnj printf("rk error: (cyl,trk,sec)=(%d,%d,%d) cs2=%b er=%b\n", 713349Swnj cn, tn, sn, rkaddr->rkcs2, RKCS2_BITS, 723349Swnj rkaddr->rker, RKER_BITS); 733349Swnj rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO; 743263Swnj rkwait(rkaddr); 753349Swnj if (errcnt == 10) { 763349Swnj printf("rk: unrecovered error\n"); 773349Swnj return (-1); 783349Swnj } 793349Swnj errcnt++; 803349Swnj goto retry; 811915Swnj } 823349Swnj if (errcnt) 833349Swnj printf("rk: recovered by retry\n"); 841915Swnj return (io->i_cc); 851915Swnj } 863263Swnj 873263Swnj rkwait(rkaddr) 883263Swnj register struct rkdevice *rkaddr; 893263Swnj { 903263Swnj 913263Swnj while ((rkaddr->rkcs1 & RK_CRDY) == 0) 923263Swnj ; 933263Swnj } 94*10024Ssam 95*10024Ssam /*ARGSUSED*/ 96*10024Ssam rkioctl(io, cmd, arg) 97*10024Ssam struct iob *io; 98*10024Ssam int cmd; 99*10024Ssam caddr_t arg; 100*10024Ssam { 101*10024Ssam 102*10024Ssam return (ECMD); 103*10024Ssam } 104