/* Error codes in stat 0 */
/* characteristics data */
/* All the packets, collected */
int align
; /* Should force alignment */
/* Bits in (unibus) status register */
register struct device
*tsaddr
= TSADDR
;
static struct tsmesg
*ubaddr
;
if (ubaddr
==0 || tsaddr
->tssr
&(OFL
|NBA
) || (tsaddr
->tssr
&SSR
)==0) {
while ((tsaddr
->tssr
& SSR
)==0) {
printf("Tape unready\n");
printf("Tape offline\n");
ctsbuf
.b_un
.b_addr
= (caddr_t
) &ts
;
ctsbuf
.b_bcount
= sizeof(ts
);
ubaddr
= (struct tsmesg
*)ubasetup(&ctsbuf
, 0);
ts_uba
= (u_short
)((long)ubaddr
+ (((long)ubaddr
>> 16) & 03));
ts
.ts_char
.char_loba
= (int)&ubaddr
->ts_sts
;
ts
.ts_char
.char_hiba
= (u_short
)((long)&ubaddr
->ts_sts
>> 16) & 03;
ts
.ts_char
.char_size
= sizeof(ts
.ts_sts
);
ts
.ts_char
.char_mode
= 0400; /* Stop on 2 tape marks */
ts
.ts_cmd
.c_cmd
= ACK
+ 04; /* write characteristics */
ts
.ts_cmd
.c_loba
= (int)&ubaddr
->ts_char
;
ts
.ts_cmd
.c_hiba
= (u_short
)((long)&ubaddr
->ts_sts
>> 16) & 03;
ts
.ts_cmd
.c_size
= sizeof(ts
.ts_sts
);
if (flag
== FWRITE
|| ((flag
&FWRITE
) && (ts_flags
&H_WRITTEN
))) {
while(bp
->b_flags
&B_BUSY
) {
sleep((caddr_t
)bp
, PRIBIO
);
bp
->b_flags
= B_BUSY
|B_READ
;
if(dbtofsb(bp
->b_blkno
) > *p
) {
if(dbtofsb(bp
->b_blkno
) == *p
&& bp
->b_flags
&B_READ
) {
bp
->b_resid
= bp
->b_bcount
;
if ((bp
->b_flags
&B_READ
)==0) {
*p
= dbtofsb(bp
->b_blkno
) + 1;
if (tstab
.b_actf
== NULL
)
tstab
.b_actl
->av_forw
= bp
;
register struct device
*tsaddr
= TSADDR
;
if ((bp
= tstab
.b_actf
) == NULL
)
if (ts_openf
< 0 || dbtofsb(bp
->b_blkno
) > ts_nxrec
)
ts
.ts_cmd
.c_cmd
= ACK
+CVC
+IE
+bp
->b_resid
;
ts
.ts_cmd
.c_loba
= 1; /* count always 1 */
} else if (blkno
== dbtofsb(bp
->b_blkno
)) {
ts_ubinfo
= ubasetup(bp
, 1);
ts
.ts_cmd
.c_loba
= (u_short
)ts_ubinfo
;
ts
.ts_cmd
.c_hiba
= (u_short
)(ts_ubinfo
>> 16) & 03;
ts
.ts_cmd
.c_size
= bp
->b_bcount
;
ts
.ts_cmd
.c_cmd
= ACK
+CVC
+IE
+READ
;
ts
.ts_cmd
.c_cmd
= ACK
+CVC
+IE
+WRITE
;
if (blkno
< dbtofsb(bp
->b_blkno
)) {
ts
.ts_cmd
.c_cmd
= ACK
+CVC
+IE
+SFORW
;
ts
.ts_cmd
.c_loba
= dbtofsb(bp
->b_blkno
) - blkno
;
ts
.ts_cmd
.c_cmd
= ACK
+CVC
+IE
+SREV
;
ts
.ts_cmd
.c_loba
= blkno
- dbtofsb(bp
->b_blkno
);
tstab
.b_actf
= bp
->av_forw
;
register struct device
*tsaddr
= TSADDR
;
register err
, errclass
, state
;
if ((bp
= tstab
.b_actf
)==NULL
)
err
= tsaddr
->tssr
& 016;
if ((tsaddr
->tssr
& SC
) == 0)
case 014: /* unrecoverable */
case 002: /* attention (shouldn't happen) */
case 012: /* "recoverable", but shouldn't happen */
case 004: /* status alert */
if (ts
.ts_sts
.xs0
&RLS
&& bp
==&rtsbuf
) /* short record */
if (ts
.ts_sts
.xs0
& TMK
) { /* tape mark */
ts
.ts_sts
.rbpcr
= bp
->b_bcount
;
case 010: /* recoverable, tape moved */
if (state
==SIO
&& ++bp
->b_errcnt
< 10) {
ts
.ts_cmd
.c_cmd
|= 01000; /* redo bit */
case 006: /* Function reject */
if (state
==SIO
&& ts
.ts_sts
.xs0
& WLE
)
printf("Tape needs a ring\n");
if ((ts
.ts_sts
.xs0
&ONL
) == 0) /* tape offline */
printf("Tape offline\n");
printf("tp: %o %o %o %o %o %o %o %o\n", tsaddr
->tssr
,
ts
.ts_sts
.s_sts
, ts
.ts_sts
.len
, ts
.ts_sts
.rbpcr
,
ts
.ts_sts
.xs0
, ts
.ts_sts
.xs1
, ts
.ts_sts
.xs2
, ts
.ts_sts
.xs3
);
tstab
.b_actf
= bp
->av_forw
;
bp
->b_resid
= ts
.ts_sts
.rbpcr
;
ts_blkno
= dbtofsb(bp
->b_blkno
);
printf("Unknown tape interrupt\n");
while (bp
= tstab
.b_actf
) {
tstab
.b_actf
= bp
->av_forw
;
physio(tsstrategy
, &rtsbuf
, dev
, B_READ
, minphys
);
physio(tsstrategy
, &rtsbuf
, dev
, B_WRITE
, minphys
);
#define UBMAP (int *)0xf30800
register struct device
*tsaddr
= TSPHYS
;
register int *ubap
= UBMAP
;
dts
.ts_cmd
.c_size
= NBPG
;
dts
.ts_cmd
.c_cmd
= ACK
+CVC
+WRITE
;
register struct device
*tsaddr
= TSPHYS
;
register struct tsmesg
*tsm
;
register int *ubap
= UBMAP
;
while ((tsaddr
->tssr
&SSR
)==0)
dtsinfo
= ((i
&0777)|02000);
tsm
= (struct tsmesg
*)dtsinfo
;
dts
.ts_cmd
.c_cmd
= ACK
+ 04;
dts
.ts_cmd
.c_loba
= (int)&tsm
->ts_char
;
dts
.ts_cmd
.c_size
= sizeof(dts
.ts_char
);
dts
.ts_char
.char_loba
= (int)&tsm
->ts_sts
;
dts
.ts_char
.char_hiba
= 0;
dts
.ts_char
.char_size
= sizeof(dts
.ts_sts
);
dts
.ts_char
.char_mode
= 0400;
register struct device
*tsaddr
= TSPHYS
;
dts
.ts_cmd
.c_cmd
= ACK
+CVC
+com
;
register struct device
*tsaddr
= TSPHYS
;
while ((tsaddr
->tssr
&SSR
)==0)