* Copyright (c) 1982, 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)rk.c 7.6 (Berkeley) %G%
#include "../vaxuba/ubareg.h"
#include "../vaxuba/rkreg.h"
#define SECTSIZ 512 /* sector size in bytes */
#define MAXCTLR 1 /* all addresses must be specified */
u_short rkstd
[MAXCTLR
] = { 0777440 };
struct disklabel rklabel
[MAXNUBA
][MAXCTLR
][8];
register struct rkdevice
*rkaddr
;
register struct disklabel
*lp
;
if ((u_int
)io
->i_ctlr
>= MAXCTLR
)
rkaddr
= (struct rkdevice
*)ubamem(io
->i_adapt
, rkstd
[io
->i_ctlr
]);
if (badaddr((char *)rkaddr
, sizeof(short)))
rkaddr
->rkcs2
= RKCS2_SCLR
;
* Read in the pack label.
lp
= &rklabel
[io
->i_adapt
][io
->i_ctlr
][io
->i_unit
];
lp
->d_nsectors
= NRKSECT
;
lp
->d_secpercyl
= NRKTRK
*NRKSECT
;
if (rkstrategy(&tio
, READ
) != SECTSIZ
)
*lp
= *(struct disklabel
*)(lbuf
+ LABELOFFSET
);
if (lp
->d_magic
!= DISKMAGIC
|| lp
->d_magic2
!= DISKMAGIC
)
printf("rk%d: unlabeled\n", io
->i_unit
);
if ((u_int
)io
->i_part
>= lp
->d_npartitions
||
(io
->i_boff
= lp
->d_partitions
[io
->i_part
].p_offset
) == -1)
u_long rk_off
[] = { 0, 241, 0, -1, -1, -1, 393, -1 };
register struct disklabel
*lp
;
register struct partition
*pp
;
register u_long
*off
= rk_off
;
for (i
= 0; i
< 8; i
++, pp
++)
register struct rkdevice
*rkaddr
;
int com
, ubinfo
, errcnt
= 0;
rkaddr
= (struct rkdevice
*)ubamem(io
->i_adapt
, rkstd
[io
->i_ctlr
]);
ubinfo
= ubasetup(io
, 1);
cn
= bn
/ (NRKSECT
*NRKTRK
);
tn
= (bn
/ NRKSECT
) % NRKTRK
;
rkaddr
->rkcs2
= io
->i_unit
;
rkaddr
->rkcs1
= RK_CDT
|RK_PACK
|RK_GO
;
rkaddr
->rkcs1
= RK_CDT
|RK_DCLR
|RK_GO
;
rkaddr
->rkda
= sn
| (tn
<< 8);
rkaddr
->rkwc
= -(io
->i_cc
>> 1);
com
= RK_CDT
|((ubinfo
>>8)&0x300)|RK_GO
;
while ((rkaddr
->rkds
& RKDS_SVAL
) == 0)
if (rkaddr
->rkcs1
& RK_CERR
) {
printf("rk error: (cyl,trk,sec)=(%d,%d,%d) cs2=%b er=%b\n",
cn
, tn
, sn
, rkaddr
->rkcs2
, RKCS2_BITS
,
rkaddr
->rker
, RKER_BITS
);
rkaddr
->rkcs1
= RK_CDT
|RK_DCLR
|RK_GO
;
printf("rk: unrecovered error\n");
printf("rk: recovered by retry\n");
register struct rkdevice
*rkaddr
;
while ((rkaddr
->rkcs1
& RK_CRDY
) == 0);