123237Smckusick /* 2*29306Smckusick * Copyright (c) 1982, 1986 Regents of the University of California. 323237Smckusick * All rights reserved. The Berkeley software License Agreement 423237Smckusick * specifies the terms and conditions for redistribution. 523237Smckusick * 6*29306Smckusick * @(#)rk.c 7.1 (Berkeley) 06/05/86 723237Smckusick */ 81915Swnj 91915Swnj /* 103263Swnj * RK611/RK07 111915Swnj */ 129806Ssam #include "../machine/pte.h" 131915Swnj 141915Swnj #include "../h/param.h" 151915Swnj #include "../h/inode.h" 167446Sroot #include "../h/fs.h" 179186Ssam 189186Ssam #include "../vaxuba/ubareg.h" 199186Ssam #include "../vaxuba/rkreg.h" 209186Ssam 211915Swnj #include "saio.h" 223263Swnj #include "savax.h" 231915Swnj 243263Swnj u_short rkstd[] = { 0777440 }; 253263Swnj short rk_off[] = { 0, 241, 0, -1, -1, -1, 393, -1 }; 261915Swnj 271915Swnj rkopen(io) 283263Swnj register struct iob *io; 291915Swnj { 303349Swnj register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]); 311915Swnj 323263Swnj if (rk_off[io->i_boff] == -1 || 331915Swnj io->i_boff < 0 || io->i_boff > 7) 341915Swnj _stop("rk bad unit"); 353263Swnj io->i_boff = rk_off[io->i_boff] * NRKSECT*NRKTRK; 363349Swnj rkaddr->rkcs2 = RKCS2_SCLR; 373349Swnj rkwait(rkaddr); 381915Swnj } 391915Swnj 401915Swnj rkstrategy(io, func) 413263Swnj register struct iob *io; 421915Swnj { 433263Swnj register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]); 443263Swnj int com; 451915Swnj daddr_t bn; 461915Swnj short dn, cn, sn, tn; 473349Swnj int ubinfo, errcnt = 0; 481915Swnj 493349Swnj retry: 501915Swnj ubinfo = ubasetup(io, 1); 511915Swnj bn = io->i_bn; 521915Swnj dn = io->i_unit; 533263Swnj cn = bn/(NRKSECT*NRKTRK); 543263Swnj sn = bn%NRKSECT; 553263Swnj tn = (bn / NRKSECT) % NRKTRK; 563263Swnj rkaddr->rkcs2 = dn; 573263Swnj rkaddr->rkcs1 = RK_CDT|RK_PACK|RK_GO; 583263Swnj rkwait(rkaddr); 593349Swnj rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO; 603349Swnj rkwait(rkaddr); 613263Swnj rkaddr->rkda = sn | (tn << 8); 623263Swnj rkaddr->rkcyl = cn; 633263Swnj rkaddr->rkba = ubinfo; 643263Swnj rkaddr->rkwc = -(io->i_cc >> 1); 654038Swnj com = RK_CDT|((ubinfo>>8)&0x300)|RK_GO; 663263Swnj if (func == READ) 673263Swnj com |= RK_READ; 683263Swnj else 693263Swnj com |= RK_WRITE; 703263Swnj rkaddr->rkcs1 = com; 713263Swnj rkwait(rkaddr); 723349Swnj while ((rkaddr->rkds & RKDS_SVAL) == 0) 731915Swnj ; 743263Swnj ubafree(io, ubinfo); 753263Swnj if (rkaddr->rkcs1 & RK_CERR) { 763349Swnj printf("rk error: (cyl,trk,sec)=(%d,%d,%d) cs2=%b er=%b\n", 773349Swnj cn, tn, sn, rkaddr->rkcs2, RKCS2_BITS, 783349Swnj rkaddr->rker, RKER_BITS); 793349Swnj rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO; 803263Swnj rkwait(rkaddr); 813349Swnj if (errcnt == 10) { 823349Swnj printf("rk: unrecovered error\n"); 833349Swnj return (-1); 843349Swnj } 853349Swnj errcnt++; 863349Swnj goto retry; 871915Swnj } 883349Swnj if (errcnt) 893349Swnj printf("rk: recovered by retry\n"); 901915Swnj return (io->i_cc); 911915Swnj } 923263Swnj 933263Swnj rkwait(rkaddr) 943263Swnj register struct rkdevice *rkaddr; 953263Swnj { 963263Swnj 973263Swnj while ((rkaddr->rkcs1 & RK_CRDY) == 0) 983263Swnj ; 993263Swnj } 10010024Ssam 10110024Ssam /*ARGSUSED*/ 10210024Ssam rkioctl(io, cmd, arg) 10310024Ssam struct iob *io; 10410024Ssam int cmd; 10510024Ssam caddr_t arg; 10610024Ssam { 10710024Ssam 10810024Ssam return (ECMD); 10910024Ssam } 110