Research V5 development
[unix-history] / usr / sys / dmr / rf.c
CommitLineData
38b9bcf4
DR
1#
2/*
3 * Copyright 1973 Bell Telephone Laboratories Inc
4 */
5
6/*
7 * RF disk driver
8 */
9
10#include "../param.h"
11#include "../buf.h"
12#include "../conf.h"
13#include "../user.h"
14
15struct {
16 int rfcs;
17 int rfwc;
18 int rfba;
19 int rfda;
20 int rfdae;
21};
22
23struct devtab rftab;
24struct buf rrfbuf;
25
26#define NRFBLK 1024
27#define RFADDR 0177460
28
29#define GO 01
30#define RCOM 02
31#define WCOM 04
32#define IENABLE 0100
33
34rfstrategy(abp)
35struct buf *abp;
36{
37 register struct buf *bp;
38
39 bp = abp;
40 if (bp->b_blkno >= NRFBLK*(bp->b_dev.d_minor+1)) {
41 bp->b_flags =| B_ERROR;
42 iodone(bp);
43 return;
44 }
45 bp->av_forw = 0;
46 spl5();
47 if (rftab.d_actf==0)
48 rftab.d_actf = bp;
49 else
50 rftab.d_actl->av_forw = bp;
51 rftab.d_actl = bp;
52 if (rftab.d_active==0)
53 rfstart();
54 spl0();
55}
56
57rfstart()
58{
59 register struct buf *bp;
60
61 if ((bp = rftab.d_actf) == 0)
62 return;
63 rftab.d_active++;
64 RFADDR->rfdae = bp->b_blkno.hibyte;
65 devstart(bp, &RFADDR->rfda, bp->b_blkno<<8, 0);
66}
67
68rfintr()
69{
70 register struct buf *bp;
71
72 if (rftab.d_active == 0)
73 return;
74 bp = rftab.d_actf;
75 rftab.d_active = 0;
76 if (RFADDR->rfcs < 0) { /* error bit */
77 deverror(bp, RFADDR->rfcs);
78 if (++rftab.d_errcnt <= 10) {
79 rfstart();
80 return;
81 }
82 bp->b_flags =| B_ERROR;
83 }
84 rftab.d_errcnt = 0;
85 rftab.d_actf = bp->av_forw;
86 iodone(bp);
87 rfstart();
88}
89
90rfread(dev)
91{
92
93 physio(rfstrategy, &rrfbuf, dev, B_READ);
94}
95
96rfwrite(dev)
97{
98
99 physio(rfstrategy, &rrfbuf, dev, B_WRITE);
100}