int hpcs1
; /* control and Status register 1 */
int hpds
; /* Drive Status */
int hper1
; /* Error register 1 */
int hpmr
; /* Maintenance */
int hpas
; /* Attention Summary */
int hpda
; /* Desired address register */
int hpdt
; /* Drive type */
int hpla
; /* Look ahead */
int hpsn
; /* serial number */
int hpof
; /* Offset register */
int hpdc
; /* Desired Cylinder address register */
int hpcc
; /* Current Cylinder */
int hper2
; /* Error register 2 */
int hper3
; /* Error register 3 */
int hpec1
; /* Burst error bit position */
int hpec2
; /* Burst error bit pattern */
#define HPADDR ((struct device *)(MBA0 + MBA_ERB))
9614, 0, /* cyl 0 thru 23 */
65536, 44, /* cyl 44 thru 200 */
65536, 201, /* cyl 201 thru 514 */
65536, 515, /* cyl 515 thru 671 */
65536, 358, /* cyl 358 thru 407 */
328548, 25, /* cyl 25 thru 810 */
322278, 44, /* cyl 44 thru 717 */
P1200
, M1200
, P1200
, M1200
,
unit
= minor(bp
->b_dev
) & 077;
(bn
= dkblock(bp
))+sz
> hp_sizes
[unit
&07].nblocks
) {
bp
->b_cylin
= bn
/(NSECT
*NTRAC
) + hp_sizes
[unit
&07].cyloff
;
register struct buf
*bp
, *dp
;
register struct device
*hpaddr
;
((struct mba_regs
*)MBA0
)->mba_cr
|= MBAIE
;
dk_busy
&= ~(1<<(unit
+DK_N
));
if((bp
=dp
->b_actf
) == NULL
)
hpaddr
= (struct device
*)((int *)HPADDR
+ 32*unit
);
if((hpaddr
->hpds
& VV
) == 0) {
hpaddr
->hpcs1
= PRESET
|GO
;
if ((hpaddr
->hpds
& (DPR
|MOL
)) != (DPR
|MOL
))
sn
= (sn
+NSECT
-SDIST
)%NSECT
;
if((hpaddr
->hpcc
& 0xffff) != cn
)
csn
= ((hpaddr
->hpla
& 0xffff)>>6) - sn
+ SDIST
- 1;
hpaddr
->hpcs1
= SEARCH
|GO
;
hptab
.b_actl
->b_forw
= dp
;
register struct buf
*bp
, *dp
;
register struct device
*hpaddr
;
if ((dp
= hptab
.b_actf
) == NULL
)
if ((bp
= dp
->b_actf
) == NULL
) {
hptab
.b_actf
= dp
->b_forw
;
unit
= minor(bp
->b_dev
) & 077;
cn
= bn
/(NSECT
*NTRAC
) + hp_sizes
[unit
&07].cyloff
;
hpaddr
= (struct device
*)((int *)HPADDR
+ 32*dn
);
if ((hpaddr
->hpds
& (DPR
|MOL
)) != (DPR
|MOL
)) {
dp
->b_actf
= bp
->av_forw
;
if(hptab
.b_errcnt
>= 16) {
hpaddr
->hpof
= hp_offset
[hptab
.b_errcnt
& 017] | FMT22
;
((struct mba_regs
*)MBA0
)->mba_cr
&= ~MBAIE
;
hpaddr
->hpcs1
= OFFSET
|GO
;
while(hpaddr
->hpds
& PIP
)
((struct mba_regs
*)MBA0
)->mba_cr
|= MBAIE
;
hpaddr
->hpda
= (tn
<< 8) + sn
;
dk_busy
|= 1<<(DK_N
+NHP
);
dk_wds
[DK_N
+NHP
] += unit
;
register struct buf
*bp
, *dp
;
register struct device
*hpaddr
;
dk_busy
&= ~(1<<(DK_N
+NHP
));
hpaddr
= (struct device
*)((int *)HPADDR
+ 32*unit
);
if (hpaddr
->hpds
& ERR
|| mbastat
& MBAEBITS
) { /* error bit */
while((hpaddr
->hpds
& DRY
) == 0)
if(++hptab
.b_errcnt
> 28 || hpaddr
->hper1
&WLE
)
bp
->b_flags
|= B_ERROR
; else
deverror(bp
, mbastat
, hpaddr
->hper1
);
if((bp
->b_flags
&B_PHYS
) == 0 &&
(hpaddr
->hper1
& (DCK
|ECH
)) == DCK
) {
i
= (hpaddr
->hpec1
& 0xffff) - 1;
bp
->b_un
.b_words
[i
] =^ (hpaddr
->hpec2
& 0xffff) << j
;
bp
->b_un
.b_words
[i
+1] =^ (hpaddr
->hpec2
& 0xffff) >> (32-j
);
printf("%D ", bp
->b_blkno
);
if((hptab
.b_errcnt
&07) == 4) {
((struct mba_regs
*)MBA0
)->mba_cr
&= ~MBAIE
;
hpaddr
->hpcs1
= RECAL
|GO
;
while(hpaddr
->hpds
& PIP
)
((struct mba_regs
*)MBA0
)->mba_cr
|= MBAIE
;
((struct mba_regs
*)MBA0
)->mba_cr
&= ~MBAIE
;
while(hpaddr
->hpds
& PIP
)
((struct mba_regs
*)MBA0
)->mba_cr
|= MBAIE
;
hptab
.b_actf
= dp
->b_forw
;
dp
->b_actf
= bp
->av_forw
;
bp
->b_resid
= -(((struct mba_regs
*)MBA0
)->mba_bcr
) & 0xffff;
((struct mba_regs
*)MBA0
)->mba_cr
|= MBAIE
;
for(unit
=0; unit
<NHP
; unit
++)
physio(hpstrategy
, &rhpbuf
, dev
, B_READ
);
physio(hpstrategy
, &rhpbuf
, dev
, B_WRITE
);