* Copyright (c) 1982, 1986, 1988 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)uda.c 7.9 (Berkeley) %G%
* UDA50/RAxx disk device driver
* Unused, but needed in udareg.h
#include "../vaxuba/udareg.h"
#include "../vaxuba/ubareg.h"
#include "../vaxuba/ubavar.h"
#define NRA 8 /* max. unit number on controller */
#define SECTSIZ 512 /* sector size in bytes */
#define MAXCTLR 1 /* all addresses must be specified */
u_short udastd
[MAXCTLR
] = { 0772150 };
struct udadevice
*udaddr
[MAXNUBA
][MAXCTLR
];
struct uda1ca uda1_ca
; /* communications area */
struct mscp uda1_rsp
; /* response packet */
struct mscp uda1_cmd
; /* command packet */
/* Unibus address of uda structure */
struct uda1
*ud_ubaddr
[MAXNUBA
][MAXCTLR
];
struct disklabel ralabel
[MAXNUBA
][MAXCTLR
][NRA
];
static u_long ramedia
[MAXNUBA
][MAXCTLR
][NRA
];
register struct disklabel
*lp
;
register struct udadevice
*addr
;
register struct uda1
*ubaaddr
;
static int udainit
[MAXNUBA
][MAXCTLR
];
if ((u_int
)(uba
= io
->i_adapt
) >= nuba
)
if ((u_int
)io
->i_ctlr
>= MAXCTLR
)
if ((u_int
)(unit
= io
->i_unit
) >= NRA
)
addr
= udaddr
[uba
][io
->i_ctlr
] =
(struct udadevice
*)ubamem(uba
, udastd
[io
->i_ctlr
]);
if (badaddr((char *)addr
, sizeof(short)))
if ((ubaaddr
= ud_ubaddr
[uba
][io
->i_ctlr
]) == 0) {
tio
.i_ma
= (caddr_t
)&uda1
;
ud_ubaddr
[uba
][io
->i_ctlr
] = ubaaddr
=
(struct uda1
*)ubasetup(&tio
, 2);
if (udainit
[uba
][io
->i_ctlr
] == 0) {
while ((addr
->udasa
& UDA_STEP1
) == 0);
while ((addr
->udasa
& UDA_STEP2
) == 0);
addr
->udasa
= (int)&ubaaddr
->uda1_ca
.ca_rspdsc
;
while ((addr
->udasa
& UDA_STEP3
) == 0);
addr
->udasa
= (int)&ubaaddr
->uda1_ca
.ca_rspdsc
>> 16;
while ((addr
->udasa
& UDA_STEP4
) == 0);
uda1
.uda1_ca
.ca_rspdsc
= (long)&ubaaddr
->uda1_rsp
.mscp_cmdref
;
uda1
.uda1_ca
.ca_cmddsc
= (long)&ubaaddr
->uda1_cmd
.mscp_cmdref
;
/* uda1.uda1_cmd.mscp_cntflgs = 0; */
if (udcmd(M_OP_SETCTLRC
, io
)) {
printf("ra: open error, SETCTLRC\n");
udainit
[uba
][io
->i_ctlr
] = 1;
lp
= &ralabel
[uba
][io
->i_ctlr
][unit
];
if (ramedia
[uba
][io
->i_ctlr
][unit
] == 0) {
uda1
.uda1_cmd
.mscp_unit
= unit
;
if (udcmd(M_OP_ONLINE
, io
)) {
printf("ra: open error, ONLINE\n");
ramedia
[uba
][io
->i_ctlr
][unit
] =
uda1
.uda1_rsp
.mscp_onle
.onle_mediaid
;
if (rastrategy(&tio
, READ
) != SECTSIZ
)
*lp
= *(struct disklabel
*)(lbuf
+ LABELOFFSET
);
if (lp
->d_magic
!= DISKMAGIC
|| lp
->d_magic2
!= DISKMAGIC
) {
printf("ra%d: unlabeled\n", unit
);
if ((u_int
)io
->i_part
>= lp
->d_npartitions
||
(io
->i_boff
= lp
->d_partitions
[io
->i_part
].p_offset
) == -1)
register struct uda1
*u
= &uda1
;
register struct mscp
*mp
;
u
->uda1_cmd
.mscp_opcode
= op
;
u
->uda1_cmd
.mscp_msglen
= MSCP_MSGLEN
;
u
->uda1_rsp
.mscp_msglen
= MSCP_MSGLEN
;
u
->uda1_ca
.ca_rspdsc
|= MSCP_OWN
|MSCP_INT
;
u
->uda1_ca
.ca_cmddsc
|= MSCP_OWN
|MSCP_INT
;
i
= udaddr
[io
->i_adapt
][io
->i_ctlr
]->udaip
; /* start uda polling */
if (u
->uda1_ca
.ca_cmdint
)
u
->uda1_ca
.ca_cmdint
= 0;
if (u
->uda1_ca
.ca_rspint
== 0)
u
->uda1_ca
.ca_rspint
= 0;
if (mp
->mscp_opcode
== (op
| M_OP_END
))
printf("unexpected rsp type %x op %x ignored\n",
MSCP_MSGTYPE(mp
->mscp_msgtc
), mp
->mscp_opcode
);
u
->uda1_ca
.ca_rspdsc
|= MSCP_OWN
| MSCP_INT
;
if ((mp
->mscp_status
&M_ST_MASK
) != M_ST_SUCCESS
)
register struct mscp
*mp
;
ubinfo
= ubasetup(io
, 1);
mp
->mscp_unit
= io
->i_unit
;
mp
->mscp_seq
.seq_lbn
= io
->i_bn
;
mp
->mscp_seq
.seq_bytecount
= io
->i_cc
;
mp
->mscp_seq
.seq_buffer
= UBAI_ADDR(ubinfo
) | (UBAI_BDP(ubinfo
) << 24);
if (udcmd(func
== READ
? M_OP_READ
: M_OP_WRITE
, io
)) {
printf("ra: I/O error\n");
u_long rc25_off
[] = { 0, 15884, 0, -1, -1, -1, 25916, -1 };
u_long rx50_off
[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
u_long rd52_off
[] = { 0, 15884, 0, 0, 0, 0, 25650, 0 };
u_long rd53_off
[] = { 0, 15884, 0, 0, 0, 33440, 49324, 15884 };
u_long ra60_off
[] = { 0, 15884, 0, 49324, 131404, 49324, 242606, 49324 };
#define ra70_off ra60_off
u_long ra80_off
[] = { 0, 15884, 0, -1, 49324, 49324, 49910, 131404 };
u_long ra81_off
[] = { 0, 16422, 0, 49324, 131404, 412490, 375564, 83538 };
u_long ra81_off
[] = { 0, 16422, 0, 375564, 391986, 699720, 375564, 83538 };
u_long ra81_off
[] = { 0, 15884, 0, 242606, 258490, 565690, 242606, 49324 };
u_long ra82_off
[] = { 0, 15884, 0, 375345, 391590, 699390, 375345, 83790 };
u_long id
; /* media ID */
u_long
*off
; /* offsets */
{ MSCP_MKDRIVE2('R', 'A', 60), ra60_off
},
{ MSCP_MKDRIVE2('R', 'A', 70), ra70_off
},
{ MSCP_MKDRIVE2('R', 'A', 80), ra80_off
},
{ MSCP_MKDRIVE2('R', 'A', 81), ra81_off
},
{ MSCP_MKDRIVE2('R', 'A', 82), ra82_off
},
{ MSCP_MKDRIVE2('R', 'C', 25), rc25_off
},
{ MSCP_MKDRIVE3('R', 'C', 'F', 25), rc25_off
},
{ MSCP_MKDRIVE2('R', 'D', 52), rd52_off
},
{ MSCP_MKDRIVE2('R', 'D', 53), rd53_off
},
{ MSCP_MKDRIVE2('R', 'X', 50), rx50_off
},
register struct disklabel
*lp
;
register struct partition
*pp
;
register struct mediamap
*map
;
i
= MSCP_MEDIA_DRIVE(ramedia
[io
->i_adapt
][io
->i_ctlr
][io
->i_unit
]);
for (map
= ra_map
; map
->id
!= 0; map
++) {
for (pp
= lp
->d_partitions
, i
= 0; i
< 8; pp
++, i
++)
pp
->p_offset
= map
->off
[i
];
printf("ra%d: media type 0x%x unsupported\n", io
->i_unit
, i
);