1*1915Swnj /* rk.c 4.1 12/17/80 */ 2*1915Swnj 3*1915Swnj /* 4*1915Swnj * RK disk driver, standalone version 5*1915Swnj */ 6*1915Swnj 7*1915Swnj #include "../h/param.h" 8*1915Swnj #include "../h/inode.h" 9*1915Swnj #include "../h/pte.h" 10*1915Swnj #include "../h/uba.h" 11*1915Swnj #include "saio.h" 12*1915Swnj 13*1915Swnj #define RKADDR ((struct rk_regs *)(PHYSUMEM - 0160000 + 0177440)) 14*1915Swnj #define FORMAT_22 0 15*1915Swnj #define RESET 0102000 16*1915Swnj #define WCOM 022 17*1915Swnj #define RCOM 020 18*1915Swnj #define RK07 02000 19*1915Swnj #define GO 01 20*1915Swnj #define RELEASE 010 21*1915Swnj #define CTLRDY 0200 22*1915Swnj #define PACKAK 000003 /* Pack Acknowledge */ 23*1915Swnj 24*1915Swnj struct rk_regs 25*1915Swnj { 26*1915Swnj short rkcs1; 27*1915Swnj short rkwc; 28*1915Swnj u_short rkba; 29*1915Swnj short rkda; 30*1915Swnj short rkcs2; 31*1915Swnj short rkds; 32*1915Swnj short rker; 33*1915Swnj short rkasof; 34*1915Swnj short rkdc; 35*1915Swnj short rknull; 36*1915Swnj short rkdb; 37*1915Swnj short rkmr1; 38*1915Swnj short rkecps; 39*1915Swnj short rkecpt; 40*1915Swnj short rkmr2; 41*1915Swnj short rkmr3; 42*1915Swnj }; 43*1915Swnj 44*1915Swnj struct devsize { 45*1915Swnj daddr_t cyloff; 46*1915Swnj } rk_sizes[] = { 47*1915Swnj 0, 146, 246, -1, -1, -1, -1, -1, 48*1915Swnj }; 49*1915Swnj 50*1915Swnj rkopen(io) 51*1915Swnj register struct iob *io; 52*1915Swnj { 53*1915Swnj 54*1915Swnj if (rk_sizes[io->i_boff].cyloff == -1 || 55*1915Swnj io->i_boff < 0 || io->i_boff > 7) 56*1915Swnj _stop("rk bad unit"); 57*1915Swnj io->i_boff = rk_sizes[io->i_boff].cyloff * 66; 58*1915Swnj } 59*1915Swnj 60*1915Swnj rkstrategy(io, func) 61*1915Swnj register struct iob *io; 62*1915Swnj { 63*1915Swnj register short com; 64*1915Swnj daddr_t bn; 65*1915Swnj short dn, cn, sn, tn; 66*1915Swnj int ubinfo; 67*1915Swnj 68*1915Swnj ubinfo = ubasetup(io, 1); 69*1915Swnj bn = io->i_bn; 70*1915Swnj dn = io->i_unit; 71*1915Swnj cn = bn/66; 72*1915Swnj sn = bn%22; 73*1915Swnj tn = (bn / 22) % 3; 74*1915Swnj 75*1915Swnj RKADDR->rkcs2 = dn; 76*1915Swnj RKADDR->rkcs1 = PACKAK | RK07; 77*1915Swnj while ((com = RKADDR->rkcs1) & 01) 78*1915Swnj ; 79*1915Swnj RKADDR->rkda = sn | (tn << 8); 80*1915Swnj RKADDR->rkdc = cn; 81*1915Swnj RKADDR->rkba = ubinfo; 82*1915Swnj RKADDR->rkwc = -(io->i_cc >> 1); 83*1915Swnj com = ((ubinfo & 0x30000) >> 8) | RK07 | GO | (FORMAT_22 << 12); 84*1915Swnj if(func == READ) 85*1915Swnj com |= RCOM; else 86*1915Swnj com |= WCOM; 87*1915Swnj RKADDR->rkcs1 = com; 88*1915Swnj while (((com = RKADDR->rkcs1) & CTLRDY) == 0) 89*1915Swnj ; 90*1915Swnj while(RKADDR->rkds >= 0) 91*1915Swnj ; 92*1915Swnj ubafree(ubinfo); 93*1915Swnj if (RKADDR->rkcs1 < 0) { /* error bit */ 94*1915Swnj printf("RK07 error: unit %d, cyl %d, trk %d, sect %d, ", 95*1915Swnj io->i_unit, cn, tn, sn); 96*1915Swnj printf("cs1 %X, cs2 %X, err %X\n", 97*1915Swnj RKADDR->rkcs1, RKADDR->rkcs2, RKADDR->rker); 98*1915Swnj RKADDR->rkcs1 = RESET|GO; 99*1915Swnj while(((com = RKADDR->rkcs1)&CTLRDY) == 0) 100*1915Swnj ; 101*1915Swnj return (-1); 102*1915Swnj } 103*1915Swnj return (io->i_cc); 104*1915Swnj } 105