* RP04/RP06/RM03 disk driver
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))
15884, 0, /* cyl 0 thru 37 */
33440, 38, /* cyl 38 thru 117 */
8360, 98, /* cyl 98 thru 117 */
15884, 118, /* cyl 118 thru 155 */
66880, 156, /* cyl 156 thru 315 */
291346, 118, /* cyl 118 thru 814, (like distrib) */
208582, 316, /* cyl 316 thru 814 */
291346, 118, /* cyl 118 thru 814 */
15884, 0, /* cyl 0 thru 99 */
33440, 100, /* cyl 100 thru 309 */
82080, 310, /* cyl 310 thru 822 */
P1200
, M1200
, P1200
, M1200
,
char hp_type
[NHP
]; /* drive type */
register unit
, xunit
, nspc
;
xunit
= minor(bp
->b_dev
) & 077;
if (hp_type
[unit
] == 0) {
/* determine device type */
hpaddr
= (struct device
*)((int*)HPADDR
+ 32*unit
);
hp_type
[unit
] = hpaddr
->hpdt
;
if (hp_type
[unit
] == RM
) {
(bn
= dkblock(bp
))+sz
> sizes
[xunit
&07].nblocks
) {
bp
->b_cylin
= bn
/nspc
+ sizes
[xunit
&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
))
if(hp_type
[unit
] == RM
) {
sn
= bn
%(NRMSECT
*NRMTRAC
);
sn
= (sn
+NRMSECT
-hpSDIST
)%NRMSECT
;
sn
= (sn
+NSECT
-hpSDIST
)%NSECT
;
if(cn
- (hpaddr
->hpdc
& 0xffff))
csn
= ((hpaddr
->hpla
& 0xffff)>>6) - sn
+ 1;
hpaddr
->hpcs1
= SEARCH
|GO
;
hptab
.b_actl
->b_forw
= dp
;
register struct buf
*bp
, *dp
;
register struct device
*hpaddr
;
int dn
, sn
, tn
, cn
, nspc
, ns
;
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
= rm_sizes
[unit
&07].cyloff
;
cn
= 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
;
mbastart(bp
, (int *)hpaddr
);
dk_busy
|= 1<<(DK_N
/*+NHP*/);
dk_numb
[DK_N
/*+NHP*/] += 1;
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 ((hpaddr
->hper1
&0xffff) == DCK
) {
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
, minphys
);
physio(hpstrategy
, &rhpbuf
, dev
, B_WRITE
, minphys
);
register struct device
*rp
;
extern char buffers
[NBUF
][BSIZE
];
b
= (((((struct mba_regs
*)MBA0
)->mba_bcr
&0xffff) +
(bp
->b_bcount
) - 1)>>9)&0177;
printf("%D ", bp
->b_blkno
+b
);
i
= (rp
->hpec1
&0xffff) - 1;
map
= ((bp
->b_un
.b_addr
- (char *)buffers
)>>9) + b
;
mix
= i
+ ((int)bp
->b_un
.b_addr
&0x1ff);
cp
= (char *)((((int *)MBA0_MAP
)[map
+(mix
>>9)]&0x1fffff)<<9)+(mix
&0x1ff);
piput((int)cp
,piget((int)cp
)^(mask
<<n
));
cp
= (char *)((((int *)MBA0_MAP
)[map
+(mix
>>9)]&0x1fffff)<<9)+(mix
&0x1ff);
piput((int)cp
,piget((int)cp
)^(mask
>>(16-n
)));
if (((struct mba_regs
*)MBA0
)->mba_bcr
) {
i
= bp
->b_blkno
%(NSECT
*NTRAC
);
i
= ((i
/NSECT
)<<8)+(i
%NSECT
);
i
= NSECT
*(i
>>8) + (i
&0377) + b
+ 1;
rp
->hpdc
= bp
->b_cylin
+ 1;
rp
->hpda
= ((i
/NSECT
)<<8) + (i
%NSECT
);
((struct mba_regs
*)MBA0
)->mba_sr
= -1;
((struct mba_regs
*)MBA0
)->mba_var
=
((map
+1)<<9)|((int)bp
->b_un
.b_addr
&0x1ff);
*(int *)mmap
= b
|(PG_V
|PG_KR
);
s
= *(short *)&vmmap
[pad
&0x1ff];
*(int *)mmap
= b
|(PG_V
|PG_KW
);
p
= (short *)&vmmap
[pad
&0x1ff];