fix comment, Name server is two words
[unix-history] / usr / src / sys / vax / stand / idc.c
CommitLineData
8ae0e4b4
KM
1/*
2 * Copyright (c) 1982 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
6 * @(#)idc.c 6.3 (Berkeley) %G%
7 */
57fa886d
SL
8
9/*
10 * IDC (RB730)
57fa886d 11 */
faeec66d 12#include "../machine/pte.h"
57fa886d
SL
13
14#include "../h/param.h"
57fa886d 15#include "../h/inode.h"
b5d17f4d 16#include "../h/fs.h"
a031a31b
SL
17
18#include "../vaxuba/idcreg.h"
19#include "../vaxuba/ubareg.h"
20
57fa886d
SL
21#include "saio.h"
22#include "savax.h"
23
24u_short idcstd[] = { 0175606 };
25short rb02_off[] = { 0, 400, 0, -1, -1, -1, -1, -1 };
26short rb80_off[] = { 0, 37, 0, -1, -1, -1, 115, 305 };
27
28int idc_type[4];
29
30idcopen(io)
31 register struct iob *io;
32{
33 register struct idcdevice *idcaddr;
34 register int i;
35
36 idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_unit) + 0x200);
37 if (io->i_boff < 0 || io->i_boff > 7)
38 _stop("idc bad unit");
39 idcaddr->idcmpr = IDCGS_GETSTAT;
40 idcaddr->idccsr = IDC_GETSTAT|(io->i_unit<<8);
41 idcwait(idcaddr);
42 i = idcaddr->idcmpr;
43 idcaddr->idccsr = IDC_CRDY|(1<<(io->i_unit+16));
44 idcwait(idcaddr);
45 idcaddr->idccsr = (io->i_unit<<8)|IDC_RHDR;
46 idcwait(idcaddr);
47 if (idcaddr->idccsr & IDC_ERR) {
48 printf("idc error: idccsr %x\n", idcaddr->idccsr);
49 _stop("idc fatal error");
50 }
51 i = idcaddr->idcmpr;
52 i = idcaddr->idcmpr;
53 if (idcaddr->idccsr & IDC_R80) {
54 idc_type[io->i_unit] = 1;
b65f093e 55 io->i_boff = rb80_off[io->i_boff] * NRB80SECT * NRB80TRK;
57fa886d
SL
56 } else {
57 idc_type[io->i_unit] = 0;
b65f093e 58 io->i_boff = rb02_off[io->i_boff] * NRB02SECT/2 * NRB02TRK;
57fa886d
SL
59 }
60 if (io->i_boff < 0)
695069ba 61 _stop("idc%d: bad unit type", io->i_unit);
57fa886d
SL
62}
63
64idcstrategy(io, func)
65 register struct iob *io;
66{
67 register struct idcdevice *idcaddr;
68 int com;
69 daddr_t bn;
70 short dn, cn, sn, tn;
695069ba 71 short ccleft, thiscc = 0;
57fa886d
SL
72 int ubinfo, errcnt = 0;
73
74 idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_unit) + 0x200);
57fa886d
SL
75 ubinfo = ubasetup(io, 1);
76 bn = io->i_bn;
695069ba
BF
77 ccleft = io->i_cc;
78retry:
57fa886d 79 dn = io->i_unit;
57fa886d
SL
80 if (idc_type[dn]) {
81 cn = bn/(NRB80SECT*NRB80TRK);
82 sn = bn%NRB80SECT;
83 tn = (bn / NRB80SECT) % NRB80TRK;
695069ba 84 thiscc = (NRB80SECT - sn) * 512;
57fa886d 85 } else {
695069ba
BF
86 cn = 2*bn/(NRB02SECT*NRB02TRK);
87 sn = (2*bn)%NRB02SECT;
88 tn = (2*bn / NRB02SECT) % NRB02TRK;
89 thiscc = (NRB02SECT - sn) * 256;
57fa886d 90 }
695069ba
BF
91 thiscc = MIN(thiscc, ccleft);
92 ccleft -= thiscc;
57fa886d
SL
93 idcaddr->idccsr = IDC_CRDY|IDC_SEEK|(dn<<8)|(1<<(dn+16));
94 idcaddr->idcdar = (cn<<16)|(tn<<8)|sn;
95 idcaddr->idccsr = IDC_SEEK|(dn<<8);
96 idcwait(idcaddr);
97 idcaddr->idccsr &= ~IDC_ATTN;
98 com = dn<<8;
99 if (func == READ)
100 com |= IDC_READ;
101 else
102 com |= IDC_WRITE;
103 idcaddr->idccsr = IDC_CRDY|com;
104 idcaddr->idcbar = ubinfo&0x3ffff;
695069ba 105 idcaddr->idcbcr = -thiscc;
57fa886d
SL
106 idcaddr->idcdar = (cn<<16)|(tn<<8)|sn;
107 idcaddr->idccsr = com;
108 idcwait(idcaddr);
57fa886d 109 if (idcaddr->idccsr & IDC_ERR) {
b65f093e
MK
110 printf("idc%d error: (cyl,trk,sec)=(%d,%d,%d) csr=%b\n",
111 dn, cn, tn, sn, idcaddr->idccsr, IDCCSR_BITS);
57fa886d
SL
112 if (errcnt == 10) {
113 printf("idc: unrecovered error\n");
695069ba 114 ubafree(io, ubinfo);
57fa886d
SL
115 return (-1);
116 }
117 errcnt++;
118 goto retry;
119 }
120 if (errcnt)
121 printf("idc: recovered by retry\n");
695069ba 122 if (ccleft) {
2e4ee04a 123 bn += thiscc/NBPG;
695069ba 124 ubinfo += thiscc;
57fa886d
SL
125 goto retry;
126 }
695069ba
BF
127 ubafree(io, ubinfo);
128 return (io->i_cc);
57fa886d
SL
129}
130
131idcwait(idcaddr)
132 register struct idcdevice *idcaddr;
133{
134 register int i;
135
136 while ((idcaddr->idccsr & (IDC_CRDY|IDC_DRDY)) != (IDC_CRDY|IDC_DRDY))
137 for (i = 10; i; i--)
138 ;
139}
75f313ad
SL
140
141/*ARGSUSED*/
142idcioctl(io, cmd, arg)
143 struct iob *io;
144 int cmd;
145 caddr_t arg;
146{
147
148 return (ECMD);
149}