* Copyright (c) 1982, 1986, 1988 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)ts.c 7.8 (Berkeley) 5/4/91
#include "../include/pte.h"
#include "../uba/tsreg.h"
#include "../uba/ubareg.h"
#define MAXCTLR 1 /* all addresses must be specified */
u_short tsstd
[MAXCTLR
] = { 0772520 };
u_short ts_uba
; /* Unibus address of ts structure */
static struct ts
*ts_ubaddr
;
register struct tsdevice
*tsaddr
;
if ((u_int
)io
->i_adapt
>= nuba
)
if ((u_int
)io
->i_ctlr
>= MAXCTLR
)
/* TS11 only supports one transport per formatter */
tsaddr
= (struct tsdevice
*)ubamem(io
->i_adapt
, tsstd
[io
->i_ctlr
]);
if (badaddr((char *)tsaddr
, sizeof (short)))
while ((tsaddr
->tssr
& TS_SSR
)==0) {
printf("ts: not ready\n");
if (tsaddr
->tssr
&TS_OFL
) {
if (tsaddr
->tssr
&TS_NBA
) {
ctsbuf
.i_ma
= (caddr_t
) &ts
;
ctsbuf
.i_cc
= sizeof(ts
);
ts_ubaddr
= (struct ts
*)ubasetup(&ctsbuf
, 2);
ts_uba
= (u_short
)((long)ts_ubaddr
+ (((long)ts_ubaddr
>>16)&03));
ts
.ts_char
.char_addr
= (int)&ts_ubaddr
->ts_sts
;
ts
.ts_char
.char_size
= sizeof(ts
.ts_sts
);
ts
.ts_char
.char_mode
= TS_ESS
;
ts
.ts_cmd
.c_cmd
= TS_ACK
|TS_SETCHR
;
i
= (int)&ts_ubaddr
->ts_char
;
ts
.ts_cmd
.c_hiba
= (i
>>16)&3;
ts
.ts_cmd
.c_size
= sizeof(ts
.ts_char
);
if (io
->i_cc
= io
->i_part
)
tsstrategy(io
, TS_SFORWF
);
register struct tsdevice
*tsaddr
;
register int errcnt
, info
;
tsaddr
= (struct tsdevice
*)ubamem(io
->i_adapt
, tsstd
[io
->i_ctlr
]);
while ((tsaddr
->tssr
& TS_SSR
) == 0)
if (func
== TS_REW
|| func
== TS_SFORWF
)
ts
.ts_cmd
.c_repcnt
= io
->i_cc
;
ts
.ts_cmd
.c_size
= io
->i_cc
;
ts
.ts_cmd
.c_hiba
= (info
>>16)&3;
else if (func
== F_WRITE
)
ts
.ts_cmd
.c_cmd
= TS_ACK
|TS_CVC
|func
;
while ((tsaddr
->tssr
& TS_SSR
) == 0);
if (ts
.ts_sts
.s_xs0
& TS_TMK
)
if (tsaddr
->tssr
& TS_SC
) {
printf("ts tape error: er=%b, xs0=%b\n",
ts
.ts_sts
.s_xs0
, TSXS0_BITS
);
printf("ts: unrecovered error\n");
if (func
== TS_RCOM
|| func
== TS_WCOM
)
printf("ts: recovered by retry\n");
return (io
->i_cc
- ts
.ts_sts
.s_rbpcr
);