Research V5 development
[unix-history] / usr / sys / dmr / rk.c
CommitLineData
9e124c93
DR
1#
2/*
3 * Copyright 1973 Bell Telephone Laboratories Inc
4 */
5
6/*
7 * RK disk driver
8 */
9
10#include "../param.h"
11#include "../buf.h"
12#include "../conf.h"
13#include "../user.h"
14
15#define RKADDR 0177400
16#define NRK 4
17#define NRKBLK 4872
18
19#define RESET 0
20#define GO 01
21#define DRESET 014
22#define IENABLE 0100
23#define DRY 0200
24#define ARDY 0100
25#define WLO 020000
26#define CTLRDY 0200
27
28struct {
29 int rkds;
30 int rker;
31 int rkcs;
32 int rkwc;
33 int rkba;
34 int rkda;
35};
36
37struct devtab rktab;
38struct buf rrkbuf;
39
40rkstrategy(abp)
41struct buf *abp;
42{
43 register struct buf *bp;
44 register *qc, *ql;
45 int d;
46
47 bp = abp;
48 d = bp->b_dev.d_minor-7;
49 if(d <= 0)
50 d = 1;
51 if (bp->b_blkno >= NRKBLK*d) {
52 bp->b_flags =| B_ERROR;
53 iodone(bp);
54 return;
55 }
56 bp->av_forw = 0;
57 spl5();
58 if (rktab.d_actf==0)
59 rktab.d_actf = bp;
60 else
61 rktab.d_actl->av_forw = bp;
62 rktab.d_actl = bp;
63 if (rktab.d_active==0)
64 rkstart();
65 spl0();
66}
67
68rkaddr(bp)
69struct buf *bp;
70{
71 register struct buf *p;
72 register int b;
73 int d, m;
74
75 p = bp;
76 b = p->b_blkno;
77 m = p->b_dev.d_minor - 7;
78 if(m <= 0)
79 d = p->b_dev.d_minor;
80 else {
81 d = lrem(b, m);
82 b = ldiv(b, m);
83 }
84 return(d<<13 | (b/12)<<4 | b%12);
85}
86
87rkstart()
88{
89 register struct buf *bp;
90
91 if ((bp = rktab.d_actf) == 0)
92 return;
93 rktab.d_active++;
94 devstart(bp, &RKADDR->rkda, rkaddr(bp), 0);
95}
96
97rkintr()
98{
99 register struct buf *bp;
100
101 if (rktab.d_active == 0)
102 return;
103 bp = rktab.d_actf;
104 rktab.d_active = 0;
105 if (RKADDR->rkcs < 0) { /* error bit */
106 deverror(bp, RKADDR->rker);
107 RKADDR->rkcs = RESET|GO;
108 while((RKADDR->rkcs&CTLRDY) == 0) ;
109 if (++rktab.d_errcnt <= 10) {
110 rkstart();
111 return;
112 }
113 bp->b_flags =| B_ERROR;
114 }
115 rktab.d_errcnt = 0;
116 rktab.d_actf = bp->av_forw;
117 iodone(bp);
118 rkstart();
119}
120
121rkread(dev)
122{
123
124 physio(rkstrategy, &rrkbuf, dev, B_READ);
125}
126
127rkwrite(dev)
128{
129
130 physio(rkstrategy, &rrkbuf, dev, B_WRITE);
131}