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