* UDA50/RAxx disk device driver
* Parameters for the communications area
u_short udastd
[] = { 0777550 };
struct udadevice
*udaddr
= 0;
struct uda
*ud_ubaddr
; /* Unibus address of uda structure */
int uda_off
[] = { 0, 15884, 0, -1, -1, -1, 49324, 131404 };
register struct mscp
*mp
;
udaddr
= (struct udadevice
*)ubamem(io
->i_unit
, udastd
[0]);
cudbuf
.i_ma
= (caddr_t
)&uda
;
cudbuf
.i_cc
= sizeof(uda
);
ud_ubaddr
= (struct uda
*)ubasetup(&cudbuf
, 2);
while ((udaddr
->udasa
& UDA_STEP1
) == 0)
while ((udaddr
->udasa
& UDA_STEP2
) == 0)
udaddr
->udasa
= (short)&ud_ubaddr
->uda_ca
.ca_ringbase
;
while ((udaddr
->udasa
& UDA_STEP3
) == 0)
udaddr
->udasa
= (short)(((int)&ud_ubaddr
->uda_ca
.ca_ringbase
) >> 16);
while ((udaddr
->udasa
& UDA_STEP4
) == 0)
uda
.uda_ca
.ca_rspdsc
[0] = (long)&ud_ubaddr
->uda_rsp
.mscp_cmdref
;
uda
.uda_ca
.ca_cmddsc
[0] = (long)&ud_ubaddr
->uda_cmd
.mscp_cmdref
;
uda
.uda_cmd
.mscp_cntflgs
= 0;
if (udcmd(M_OP_STCON
) == 0) {
_stop("ra: open error, STCON");
uda
.uda_cmd
.mscp_unit
= io
->i_unit
&7;
if (udcmd(M_OP_ONLIN
) == 0) {
_stop("ra: open error, ONLIN");
if (io
->i_boff
< 0 || io
->i_boff
> 7 || uda_off
[io
->i_boff
] == -1)
io
->i_boff
= uda_off
[io
->i_boff
];
uda
.uda_cmd
.mscp_opcode
= op
;
uda
.uda_rsp
.mscp_header
.uda_msglen
= sizeof (struct mscp
);
uda
.uda_cmd
.mscp_header
.uda_msglen
= sizeof (struct mscp
);
uda
.uda_ca
.ca_rspdsc
[0] |= UDA_OWN
|UDA_INT
;
uda
.uda_ca
.ca_cmddsc
[0] |= UDA_OWN
|UDA_INT
;
if (uda
.uda_ca
.ca_cmdint
)
uda
.uda_ca
.ca_cmdint
= 0;
if (uda
.uda_ca
.ca_rspint
)
uda
.uda_ca
.ca_rspint
= 0;
if (mp
->mscp_opcode
!= (op
|M_OP_END
) ||
(mp
->mscp_status
&M_ST_MASK
) != M_ST_SUCC
)
register struct mscp
*mp
;
ubinfo
= ubasetup(io
, 1);
mp
->mscp_unit
= io
->i_unit
&7;
mp
->mscp_bytecnt
= io
->i_cc
;
mp
->mscp_buffer
= (ubinfo
& 0x3ffff) | (((ubinfo
>>28)&0xf)<<24);
if ((mp
= udcmd(func
== READ
? M_OP_READ
: M_OP_WRITE
)) == 0) {
printf("ra: I/O error\n");