2.11BSD/sys/pdpstand/rk.c
/*
* Copyright (c) 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* @(#)rk.c 2.2 (2.11BSD) 1996/3/8
*/
/*
* RK disk driver
*/
#include "../h/param.h"
#include "../pdpuba/rkreg.h"
#include "saio.h"
#define NRK 2
struct rkdevice *RKcsr[NRK + 1] =
{
(struct rkdevice *)0177400,
(struct rkdevice *)0,
(struct rkdevice *)-1
};
rkstrategy(io, func)
register struct iob *io;
{
register com;
register struct rkdevice *rkaddr;
daddr_t bn;
int dn, cn, sn, bae, lo16;
bn = io->i_bn;
dn = io->i_unit;
cn = bn/12;
sn = bn%12;
iomapadr(io->i_ma, &bae, &lo16);
rkaddr = RKcsr[io->i_ctlr];
rkaddr->rkda = (dn<<13) | (cn<<4) | sn;
rkaddr->rkba = (caddr_t)lo16;
rkaddr->rkwc = -(io->i_cc>>1);
com = (bae<<4)|RKCS_GO;
if (func == READ)
com |= RKCS_RCOM;
else
com |= RKCS_WCOM;
rkaddr->rkcs = com;
while ((rkaddr->rkcs & RKCS_RDY) == 0)
continue;
if (rkaddr->rkcs<0) { /* error bit */
printf("%s err cy=%d sc=%d, er=%o, ds=%o\n",
devname(io), cn, sn, rkaddr->rker, rkaddr->rkds);
return(-1);
}
return(io->i_cc);
}
rkopen(io)
struct iob *io;
{
return(genopen(NRK, io));
}