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