made it work. DLW
[unix-history] / usr / src / sys / vax / stand / uda.c
CommitLineData
92e67171 1/* uda.c 6.1 83/07/29 */
788aa549
SL
2
3/*
4 * UDA50/RAxx disk device driver
5 */
faeec66d 6#include "../machine/pte.h"
788aa549
SL
7
8#include "../h/param.h"
9#include "../h/inode.h"
b5d17f4d 10#include "../h/fs.h"
a031a31b 11
788aa549
SL
12#include "saio.h"
13#include "savax.h"
14
15/*
16 * Parameters for the communications area
17 */
18#define NRSPL2 0
19#define NCMDL2 0
20#define NRSP (1<<NRSPL2)
21#define NCMD (1<<NCMDL2)
22
a031a31b
SL
23#include "../vaxuba/udareg.h"
24#include "../vaxuba/ubareg.h"
25#include "../vax/mscp.h"
788aa549 26
840c0e98 27u_short udastd[] = { 0772150 };
788aa549
SL
28
29struct iob cudbuf;
30
31struct udadevice *udaddr = 0;
32
33struct uda {
34 struct udaca uda_ca;
35 struct mscp uda_rsp;
36 struct mscp uda_cmd;
37} uda;
38
39struct uda *ud_ubaddr; /* Unibus address of uda structure */
40
41int uda_off[] = { 0, 15884, 0, -1, -1, -1, 49324, 131404 };
42
43struct mscp *udcmd();
44
76780d43 45raopen(io)
788aa549
SL
46 register struct iob *io;
47{
48 register struct mscp *mp;
49 int i;
50
51 if (udaddr == 0)
52 udaddr = (struct udadevice *)ubamem(io->i_unit, udastd[0]);
53 if (ud_ubaddr == 0) {
54 cudbuf.i_ma = (caddr_t)&uda;
55 cudbuf.i_cc = sizeof(uda);
56 ud_ubaddr = (struct uda *)ubasetup(&cudbuf, 2);
57 }
58 udaddr->udaip = 0;
59 while ((udaddr->udasa & UDA_STEP1) == 0)
60 ;
61 udaddr->udasa = UDA_ERR;
62 while ((udaddr->udasa & UDA_STEP2) == 0)
63 ;
64 udaddr->udasa = (short)&ud_ubaddr->uda_ca.ca_ringbase;
65 while ((udaddr->udasa & UDA_STEP3) == 0)
66 ;
67 udaddr->udasa = (short)(((int)&ud_ubaddr->uda_ca.ca_ringbase) >> 16);
68 while ((udaddr->udasa & UDA_STEP4) == 0)
69 ;
70 udaddr->udasa = UDA_GO;
71 uda.uda_ca.ca_rspdsc[0] = (long)&ud_ubaddr->uda_rsp.mscp_cmdref;
72 uda.uda_ca.ca_cmddsc[0] = (long)&ud_ubaddr->uda_cmd.mscp_cmdref;
73 uda.uda_cmd.mscp_cntflgs = 0;
74 if (udcmd(M_OP_STCON) == 0) {
75 _stop("ra: open error, STCON");
76 return;
77 }
78 uda.uda_cmd.mscp_unit = io->i_unit&7;
79 if (udcmd(M_OP_ONLIN) == 0) {
80 _stop("ra: open error, ONLIN");
81 return;
82 }
83 if (io->i_boff < 0 || io->i_boff > 7 || uda_off[io->i_boff] == -1)
84 _stop("ra: bad unit");
85 io->i_boff = uda_off[io->i_boff];
86}
87
88struct mscp *
89udcmd(op)
90 int op;
91{
92 struct mscp *mp;
93 int i;
94
95 uda.uda_cmd.mscp_opcode = op;
96 uda.uda_rsp.mscp_header.uda_msglen = sizeof (struct mscp);
97 uda.uda_cmd.mscp_header.uda_msglen = sizeof (struct mscp);
98 uda.uda_ca.ca_rspdsc[0] |= UDA_OWN|UDA_INT;
99 uda.uda_ca.ca_cmddsc[0] |= UDA_OWN|UDA_INT;
100 i = udaddr->udaip;
101 for (;;) {
102 if (uda.uda_ca.ca_cmdint)
103 uda.uda_ca.ca_cmdint = 0;
104 if (uda.uda_ca.ca_rspint)
105 break;
106 }
107 uda.uda_ca.ca_rspint = 0;
108 mp = &uda.uda_rsp;
109 if (mp->mscp_opcode != (op|M_OP_END) ||
110 (mp->mscp_status&M_ST_MASK) != M_ST_SUCC)
111 return(0);
112 return(mp);
113}
114
76780d43 115rastrategy(io, func)
788aa549
SL
116 register struct iob *io;
117{
118 register struct mscp *mp;
119 int ubinfo;
120
121 ubinfo = ubasetup(io, 1);
122 mp = &uda.uda_cmd;
123 mp->mscp_lbn = io->i_bn;
124 mp->mscp_unit = io->i_unit&7;
125 mp->mscp_bytecnt = io->i_cc;
126 mp->mscp_buffer = (ubinfo & 0x3ffff) | (((ubinfo>>28)&0xf)<<24);
127 if ((mp = udcmd(func == READ ? M_OP_READ : M_OP_WRITE)) == 0) {
128 printf("ra: I/O error\n");
129 ubafree(io, ubinfo);
130 return(-1);
131 }
132 ubafree(io, ubinfo);
133 return(io->i_cc);
134}
75f313ad
SL
135
136/*ARGSUSED*/
76780d43 137raioctl(io, cmd, arg)
75f313ad
SL
138 struct iob *io;
139 int cmd;
140 caddr_t arg;
141{
142
143 return (ECMD);
144}