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