#define NBLK (NTRK*NSECT*NCYL)
#define CCLR 0100000 /* controller clear */
#define DI 040000 /* drive interrupt */
#define CTO 04000 /* controller timeout */
#define CDT 02000 /* drive type (rk07/rk06) */
#define RDY 0200 /* controller ready */
#define IEN 0100 /* interrupt enable */
#define DLT 0100000 /* data late */
#define WCE 040000 /* write check */
#define UPE 020000 /* unibus parity */
#define NED 010000 /* non-existant drive */
#define NEM 04000 /* non-existant memory */
#define PGE 02000 /* software error */
#define MDS 01000 /* multiple drive select */
#define UFE 0400 /* unit field error */
#define SCLR 040 /* subsystem clear */
#define cs2abort (NED|NEM|PGE|UFE)
#define SVAL 0100000 /* status valid */
#define CDA 040000 /* current drive attention */
#define PIP 020000 /* positioning in progress */
#define WRL 04000 /* write lock */
#define DDT 0400 /* disk drive type */
#define DRDY 0200 /* drive ready */
#define VV 0100 /* volume valid */
#define DROT 040 /* drive off track */
#define SPLS 020 /* speed loss */
#define ACLO 010 /* ac low */
#define OFFSET 04 /* offset mode */
#define DRA 01 /* drive available */
#define dsabort (ACLO|SPLS)
6600, 146, /* 146 - 245 */
37554, 246, /* 246 - 815 */
if (dn
> (NRK
<<3) || sz
+bp
->b_blkno
>= rk_sizes
[dn
&07].nblocks
) {
bp
->av_forw
= (struct buf
*)NULL
;
rktab
.b_actl
->av_forw
= bp
;
if(rktab
.b_active
== NULL
)
register struct device
*rkaddr
= RKADDR
;
if ((bp
= rktab
.b_actf
) == NULL
)
rk_info
= ubasetup(bp
, 1);
cn
+= rk_sizes
[dn
&07].cyloff
;
if (dn
!= (rkaddr
->rkcs2
&07)) {
rkaddr
->rkcs1
= CDT
| GO
;
while ((rkaddr
->rkcs1
&RDY
)==0)
if ((rkaddr
->rkds
& VV
) == 0) {
rkaddr
->rkcs1
= PACK
| CDT
| GO
;
while ((rkaddr
->rkcs1
&RDY
)==0)
rkaddr
->rkda
= (tn
<< 8) | sn
;
ttn
= tn
; tcn
= cn
; tsn
= sn
;
rkaddr
->rkwc
= -(bp
->b_bcount
>>1);
com
= ((rk_info
&0x30000) >> 8) | CDT
| IEN
| GO
;
register struct device
*rkaddr
= RKADDR
;
if (rktab
.b_active
== NULL
)
if (rkaddr
->rkcs1
< 0) { /* error bit */
d
= (minor(bp
->b_dev
)>>3);
if ((rkaddr
->rkds
&CDA
) || (rkaddr
->rkcs1
&DI
)) {
er
= (unsigned short)rkaddr
->rker
;
ds
= (unsigned short)rkaddr
->rkds
;
rkaddr
->rkcs1
= CDT
| DCLR
| GO
;
if ((rkaddr
->rkds
&SVAL
)==0) {
er
= (unsigned short)rkaddr
->rker
;
ds
= (unsigned short)rkaddr
->rkds
;
if (rkaddr
->rkds
&dsabort
) {
printf("rk %d is down\n", d
);
if (rkaddr
->rkcs2
&cs2abort
) {
printf("cs2 abort %o\n", rkaddr
->rkcs2
);
if (rktab
.b_errcnt
>= 10) {
printf("cn %d tn %d sn %d\n", tcn
, ttn
, tsn
);
rkaddr
->rkcs1
= CDT
| DCLR
| GO
;
while ((rkaddr
->rkcs1
&RDY
)==0)
while ((rkaddr
->rkcs1
&RDY
)==0)
if ((x
=rkselect(rkaddr
, d
)) == 0) {
printf("after clears\n");
rkaddr
->rkcs1
= CDT
| RESET
| GO
;
while (rkaddr
->rkds
& PIP
)
if (++rktab
.b_errcnt
<= 10) {
rktab
.b_actf
= bp
->av_forw
;
register struct device
*rkaddr
;
register struct device
*rkaddr
;
for(t
=0x8000; t
&& ((rkaddr
->rkds
&DRDY
)==0); t
--)
printf("rk not ready\n");
physio(rkstrategy
, &rrkbuf
, dev
, B_READ
, minphys
);
physio(rkstrategy
, &rrkbuf
, dev
, B_WRITE
, minphys
);