+int rkprobe(), rkslave(), rkattach(), rkdgo(), rkintr();
+struct uba_ctlr *rkminfo[NHK];
+struct uba_device *rkdinfo[NRK];
+struct uba_device *rkip[NHK][4];
+
+u_short rkstd[] = { 0777440, 0 };
+struct uba_driver hkdriver =
+ { rkprobe, rkslave, rkattach, rkdgo, rkstd, "rk", rkdinfo, "hk", rkminfo, 1 };
+struct buf rkutab[NRK];
+short rkcyl[NRK];
+#ifndef NOBADSECT
+struct dkbad rkbad[NRK];
+struct buf brkbuf[NRK];
+#endif
+
+struct rkst {
+ short nsect;
+ short ntrak;
+ short nspc;
+ short ncyl;
+ struct size *sizes;
+} rkst[] = {
+ NRKSECT, NRKTRK, NRKSECT*NRKTRK, NRK7CYL, rk7_sizes,
+ NRKSECT, NRKTRK, NRKSECT*NRKTRK, NRK6CYL, rk6_sizes,
+};
+
+u_char rk_offset[16] =
+ { RKAS_P400,RKAS_M400,RKAS_P400,RKAS_M400,RKAS_P800,RKAS_M800,RKAS_P800,
+ RKAS_M800,RKAS_P1200,RKAS_M1200,RKAS_P1200,RKAS_M1200,0,0,0,0
+ };
+
+struct buf rrkbuf[NRK];
+
+#define b_cylin b_resid
+
+#ifdef INTRLVE
+daddr_t dkblock();
+#endif
+
+int rkwstart, rkwatch();
+
+rkprobe(reg)
+ caddr_t reg;
+{
+ register int br, cvec;
+
+#ifdef lint
+ br = 0; cvec = br; br = cvec;
+#endif
+ ((struct rkdevice *)reg)->rkcs1 = RK_CDT|RK_IE|RK_CRDY;
+ DELAY(10);
+ ((struct rkdevice *)reg)->rkcs1 = RK_CDT;
+ return (1);
+}
+
+rkslave(ui, reg)
+ struct uba_device *ui;
+ caddr_t reg;
+{
+ register struct rkdevice *rkaddr = (struct rkdevice *)reg;
+
+ ui->ui_type = 0;
+ rkaddr->rkcs1 = RK_CCLR;
+ rkaddr->rkcs2 = ui->ui_slave;
+ rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO;
+ rkwait(rkaddr);
+ DELAY(50);
+ if (rkaddr->rkcs2&RKCS2_NED || (rkaddr->rkds&RKDS_SVAL) == 0) {
+ rkaddr->rkcs1 = RK_CCLR;
+ return (0);
+ }
+ if (rkaddr->rkcs1&RK_CERR && rkaddr->rker&RKER_DTYE) {
+ ui->ui_type = 1;
+ rkaddr->rkcs1 = RK_CCLR;
+ }
+ return (1);
+}
+
+rkattach(ui)
+ register struct uba_device *ui;
+{
+
+ if (rkwstart == 0) {
+ timeout(rkwatch, (caddr_t)0, hz);
+ rkwstart++;
+ }
+ if (ui->ui_dk >= 0)
+ dk_mspw[ui->ui_dk] = 1.0 / (60 * NRKSECT * 256);
+ rkip[ui->ui_ctlr][ui->ui_slave] = ui;
+ rk_softc[ui->ui_ctlr].sc_ndrive++;
+ rkcyl[ui->ui_unit] = -1;
+ ui->ui_flags = 0;
+}
+