set SO_KEEPALIVE when start exiting to force dead circuits to die
[unix-history] / usr / src / sys / vax / stand / ht.c
CommitLineData
1edcc975 1/* ht.c 4.7 82/03/07 */
fbfcdb0a
BJ
2
3/*
2d19f71b 4 * TM03/TU?? tape driver
fbfcdb0a
BJ
5 */
6
2d19f71b 7#include "../h/htreg.h"
fbfcdb0a
BJ
8#include "../h/param.h"
9#include "../h/inode.h"
f7acbdcc 10#include "../h/pte.h"
2d19f71b 11#include "../h/mbareg.h"
1edcc975 12#include "../h/fs.h"
fbfcdb0a 13#include "saio.h"
2d19f71b 14#include "savax.h"
fbfcdb0a 15
10899d3a
BJ
16short httypes[] =
17 { MBDT_TM03, MBDT_TE16, MBDT_TU45, MBDT_TU77, 0 };
18
19#define MASKREG(reg) ((reg)&0xffff)
20
fbfcdb0a 21htopen(io)
2d19f71b 22 register struct iob *io;
fbfcdb0a 23{
2d19f71b
BJ
24 register int skip;
25 register struct htdevice *htaddr = (struct htdevice *)mbadrv(io->i_unit);
fbfcdb0a
BJ
26 int i;
27
10899d3a
BJ
28 for (i = 0; httypes[i]; i++)
29 if (httypes[i] == (htaddr->htdt&MBDT_TYPE))
30 goto found;
31 _stop("not a tape\n");
32found:
2d19f71b
BJ
33 mbainit(UNITTOMBA(io->i_unit));
34 htaddr->htcs1 = HT_DCLR|HT_GO;
35 htstrategy(io, HT_REW);
fbfcdb0a
BJ
36 skip = io->i_boff;
37 while (skip--) {
38 io->i_cc = -1;
2d19f71b 39 while (htstrategy(io, HT_SFORW))
fbfcdb0a 40 ;
2d19f71b
BJ
41 DELAY(65536);
42 htstrategy(io, HT_SENSE);
fbfcdb0a
BJ
43 }
44}
45
46htclose(io)
2d19f71b 47 register struct iob *io;
fbfcdb0a 48{
2d19f71b
BJ
49
50 htstrategy(io, HT_REW);
fbfcdb0a
BJ
51}
52
53htstrategy(io, func)
2d19f71b
BJ
54 register struct iob *io;
55 int func;
fbfcdb0a 56{
2d19f71b 57 register int den, errcnt, ds;
cc00b603 58 int er;
fbfcdb0a 59 short fc;
2d19f71b
BJ
60 register struct htdevice *htaddr =
61 (struct htdevice *)mbadrv(io->i_unit);
fbfcdb0a 62
fbfcdb0a
BJ
63 errcnt = 0;
64retry:
2d19f71b
BJ
65 den = HTTC_1600BPI|HTTC_PDP11;
66 htquiet(htaddr);
10899d3a 67 htaddr->htcs1 = HT_DCLR|HT_GO;
2d19f71b
BJ
68 htaddr->httc = den;
69 htaddr->htfc = -io->i_cc;
70 if (func == HT_SREV) {
71 htaddr->htfc = -1;
72 htaddr->htcs1 = HT_SREV|HT_GO;
73 return (0);
fbfcdb0a 74 }
610c6f01 75 if (func == READ || func == WRITE)
2d19f71b 76 mbastart(io, func);
fbfcdb0a 77 else
2d19f71b
BJ
78 htaddr->htcs1 = func|HT_GO;
79 htquiet(htaddr);
80 ds = htaddr->htds;
cc00b603 81 er = htaddr->hter;
2d19f71b
BJ
82 if (ds & HTDS_TM) {
83 htaddr->htcs1 = HT_DCLR|HT_GO;
84 return (0);
fbfcdb0a 85 }
2d19f71b 86 if (ds & HTDS_ERR) {
2d19f71b 87 htaddr->htcs1 = HT_DCLR|HT_GO;
cc00b603
BJ
88 if ((er & HTER_CORCRC) == 0) {
89 printf("ht error: ds=%b, er=%b\n",
90 MASKREG(ds), HTDS_BITS,
91 MASKREG(er), HTER_BITS);
92 if (errcnt == 10) {
93 printf("ht: unrecovered error\n");
94 return (-1);
95 }
96 errcnt++;
97 htstrategy(io, HT_SREV);
98 goto retry;
fbfcdb0a 99 }
fbfcdb0a
BJ
100 }
101 if (errcnt)
10899d3a 102 printf("ht: recovered by retry\n");
2d19f71b
BJ
103 fc = htaddr->htfc;
104 return (io->i_cc+fc);
fbfcdb0a
BJ
105}
106
2d19f71b
BJ
107htquiet(htaddr)
108 register struct htdevice *htaddr;
fbfcdb0a
BJ
109{
110 register int s;
111
112 do
2d19f71b
BJ
113 s = htaddr->htds;
114 while ((s & HTDS_DRY) == 0);
e63bbd8c 115}
cc00b603
BJ
116
117