Commit | Line | Data |
---|---|---|
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 |
15 | short httypes[] = |
16 | { MBDT_TM03, MBDT_TE16, MBDT_TU45, MBDT_TU77, 0 }; | |
17 | ||
18 | #define MASKREG(reg) ((reg)&0xffff) | |
19 | ||
fbfcdb0a | 20 | htopen(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"); | |
31 | found: | |
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 | ||
45 | htclose(io) | |
2d19f71b | 46 | register struct iob *io; |
fbfcdb0a | 47 | { |
2d19f71b BJ |
48 | |
49 | htstrategy(io, HT_REW); | |
fbfcdb0a BJ |
50 | } |
51 | ||
52 | htstrategy(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; |
62 | retry: | |
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 |
102 | htquiet(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 | } |