Commit | Line | Data |
---|---|---|
8ae0e4b4 | 1 | /* |
0880b18e | 2 | * Copyright (c) 1982, 1986 Regents of the University of California. |
8ae0e4b4 KM |
3 | * All rights reserved. The Berkeley software License Agreement |
4 | * specifies the terms and conditions for redistribution. | |
5 | * | |
c18e27ed | 6 | * @(#)ht.c 7.4 (Berkeley) %G% |
8ae0e4b4 | 7 | */ |
fbfcdb0a BJ |
8 | |
9 | /* | |
2d19f71b | 10 | * TM03/TU?? tape driver |
fbfcdb0a | 11 | */ |
c18e27ed | 12 | #include "machine/pte.h" |
fbfcdb0a | 13 | |
39c71180 MK |
14 | #include "param.h" |
15 | #include "inode.h" | |
16 | #include "fs.h" | |
a031a31b SL |
17 | |
18 | #include "../vaxmba/htreg.h" | |
19 | #include "../vaxmba/mbareg.h" | |
20 | ||
fbfcdb0a | 21 | #include "saio.h" |
2d19f71b | 22 | #include "savax.h" |
fbfcdb0a | 23 | |
10899d3a BJ |
24 | short httypes[] = |
25 | { MBDT_TM03, MBDT_TE16, MBDT_TU45, MBDT_TU77, 0 }; | |
26 | ||
27 | #define MASKREG(reg) ((reg)&0xffff) | |
28 | ||
fbfcdb0a | 29 | htopen(io) |
2d19f71b | 30 | register struct iob *io; |
fbfcdb0a | 31 | { |
49c2f2f8 KB |
32 | register struct htdevice *htaddr; |
33 | register int i, skip; | |
fbfcdb0a | 34 | |
49c2f2f8 KB |
35 | htaddr = (struct htdevice *)mbadrv(io->i_adapt, io->i_ctlr); |
36 | if (mbainit(io->i_adapt) == 0) | |
37 | return (EADAPT); | |
38 | for (i = 0;; i++) { | |
39 | if (!httypes[i]) { | |
40 | printf("ht: not a tape\n"); | |
41 | return (ENXIO); | |
42 | } | |
10899d3a | 43 | if (httypes[i] == (htaddr->htdt&MBDT_TYPE)) |
49c2f2f8 KB |
44 | break; |
45 | } | |
2d19f71b BJ |
46 | htaddr->htcs1 = HT_DCLR|HT_GO; |
47 | htstrategy(io, HT_REW); | |
49c2f2f8 | 48 | for (skip = io->i_part; skip--;) { |
fbfcdb0a | 49 | io->i_cc = -1; |
49c2f2f8 | 50 | while (htstrategy(io, HT_SFORW)); |
2d19f71b BJ |
51 | DELAY(65536); |
52 | htstrategy(io, HT_SENSE); | |
fbfcdb0a | 53 | } |
39c71180 | 54 | return (0); |
fbfcdb0a BJ |
55 | } |
56 | ||
57 | htclose(io) | |
2d19f71b | 58 | register struct iob *io; |
fbfcdb0a | 59 | { |
2d19f71b | 60 | htstrategy(io, HT_REW); |
fbfcdb0a BJ |
61 | } |
62 | ||
63 | htstrategy(io, func) | |
2d19f71b BJ |
64 | register struct iob *io; |
65 | int func; | |
fbfcdb0a | 66 | { |
49c2f2f8 | 67 | register struct htdevice *htaddr; |
2d19f71b | 68 | register int den, errcnt, ds; |
cc00b603 | 69 | int er; |
fbfcdb0a BJ |
70 | short fc; |
71 | ||
fbfcdb0a | 72 | errcnt = 0; |
49c2f2f8 | 73 | htaddr = (struct htdevice *)mbadrv(io->i_adapt, io->i_ctlr); |
fbfcdb0a | 74 | retry: |
49c2f2f8 | 75 | den = HTTC_1600BPI | HTTC_PDP11 | io->i_unit; |
2d19f71b | 76 | htquiet(htaddr); |
10899d3a | 77 | htaddr->htcs1 = HT_DCLR|HT_GO; |
2d19f71b BJ |
78 | htaddr->httc = den; |
79 | htaddr->htfc = -io->i_cc; | |
80 | if (func == HT_SREV) { | |
81 | htaddr->htfc = -1; | |
82 | htaddr->htcs1 = HT_SREV|HT_GO; | |
83 | return (0); | |
fbfcdb0a | 84 | } |
610c6f01 | 85 | if (func == READ || func == WRITE) |
49c2f2f8 | 86 | mbastart(io, io->i_ctlr, func); |
fbfcdb0a | 87 | else |
2d19f71b BJ |
88 | htaddr->htcs1 = func|HT_GO; |
89 | htquiet(htaddr); | |
90 | ds = htaddr->htds; | |
cc00b603 | 91 | er = htaddr->hter; |
2d19f71b BJ |
92 | if (ds & HTDS_TM) { |
93 | htaddr->htcs1 = HT_DCLR|HT_GO; | |
94 | return (0); | |
fbfcdb0a | 95 | } |
2d19f71b | 96 | if (ds & HTDS_ERR) { |
2d19f71b | 97 | htaddr->htcs1 = HT_DCLR|HT_GO; |
cc00b603 BJ |
98 | if ((er & HTER_CORCRC) == 0) { |
99 | printf("ht error: ds=%b, er=%b\n", | |
100 | MASKREG(ds), HTDS_BITS, | |
101 | MASKREG(er), HTER_BITS); | |
49c2f2f8 | 102 | if (errcnt++ == 10) { |
cc00b603 BJ |
103 | printf("ht: unrecovered error\n"); |
104 | return (-1); | |
105 | } | |
cc00b603 BJ |
106 | htstrategy(io, HT_SREV); |
107 | goto retry; | |
fbfcdb0a | 108 | } |
fbfcdb0a BJ |
109 | } |
110 | if (errcnt) | |
10899d3a | 111 | printf("ht: recovered by retry\n"); |
2d19f71b BJ |
112 | fc = htaddr->htfc; |
113 | return (io->i_cc+fc); | |
fbfcdb0a BJ |
114 | } |
115 | ||
49c2f2f8 | 116 | static |
2d19f71b BJ |
117 | htquiet(htaddr) |
118 | register struct htdevice *htaddr; | |
fbfcdb0a BJ |
119 | { |
120 | register int s; | |
121 | ||
122 | do | |
2d19f71b BJ |
123 | s = htaddr->htds; |
124 | while ((s & HTDS_DRY) == 0); | |
e63bbd8c | 125 | } |