Commit | Line | Data |
---|---|---|
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 |
18 | short httypes[] = |
19 | { MBDT_TM03, MBDT_TE16, MBDT_TU45, MBDT_TU77, 0 }; | |
20 | ||
21 | #define MASKREG(reg) ((reg)&0xffff) | |
22 | ||
fbfcdb0a | 23 | htopen(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"); | |
34 | found: | |
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 | ||
48 | htclose(io) | |
2d19f71b | 49 | register struct iob *io; |
fbfcdb0a | 50 | { |
2d19f71b BJ |
51 | |
52 | htstrategy(io, HT_REW); | |
fbfcdb0a BJ |
53 | } |
54 | ||
55 | htstrategy(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; |
66 | retry: | |
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 |
109 | htquiet(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 |