Commit | Line | Data |
---|---|---|
da7c5cc6 | 1 | /* |
99152021 | 2 | * Copyright (c) 1982, 1986, 1988 Regents of the University of California. |
da7c5cc6 KM |
3 | * All rights reserved. The Berkeley software License Agreement |
4 | * specifies the terms and conditions for redistribution. | |
5 | * | |
99152021 | 6 | * @(#)tm.c 7.5 (Berkeley) %G% |
da7c5cc6 | 7 | */ |
99fe9747 | 8 | |
32ce6f5e | 9 | /* |
99fe9747 | 10 | * TM11/TE?? |
32ce6f5e BJ |
11 | */ |
12 | ||
39c71180 MK |
13 | #include "param.h" |
14 | #include "inode.h" | |
15 | #include "fs.h" | |
a031a31b | 16 | |
99152021 MK |
17 | #include "../vax/pte.h" |
18 | ||
a031a31b SL |
19 | #include "../vaxuba/ubareg.h" |
20 | #include "../vaxuba/tmreg.h" | |
21 | ||
32ce6f5e | 22 | #include "saio.h" |
99fe9747 | 23 | #include "savax.h" |
32ce6f5e | 24 | |
c48789a9 KB |
25 | #define MAXCTLR 1 /* all addresses must be specified */ |
26 | u_short tmstd[MAXCTLR] = { 0172520 }; | |
32ce6f5e BJ |
27 | |
28 | tmopen(io) | |
327a6aab | 29 | register struct iob *io; |
32ce6f5e | 30 | { |
c48789a9 | 31 | register int skip; |
32ce6f5e | 32 | |
99152021 MK |
33 | if ((u_int)io->i_adapt >= nuba) |
34 | return (EADAPT); | |
c48789a9 KB |
35 | if ((u_int)io->i_ctlr >= MAXCTLR) |
36 | return (ECTLR); | |
9ab9be08 | 37 | if (badaddr((char *)ubamem(io->i_adapt, tmstd[io->i_ctlr]), sizeof(short))) |
39c71180 | 38 | return (ENXIO); |
99fe9747 | 39 | tmstrategy(io, TM_REW); |
c48789a9 | 40 | for (skip = io->i_part; skip--;) { |
32ce6f5e | 41 | io->i_cc = 0; |
78a7384b | 42 | tmstrategy(io, TM_SFORW); |
32ce6f5e | 43 | } |
39c71180 | 44 | return (0); |
32ce6f5e BJ |
45 | } |
46 | ||
47 | tmclose(io) | |
327a6aab | 48 | register struct iob *io; |
32ce6f5e | 49 | { |
99fe9747 | 50 | tmstrategy(io, TM_REW); |
32ce6f5e BJ |
51 | } |
52 | ||
53 | tmstrategy(io, func) | |
327a6aab | 54 | register struct iob *io; |
32ce6f5e | 55 | { |
c48789a9 KB |
56 | register int com, errcnt; |
57 | register struct tmdevice *tmaddr; | |
99fe9747 | 58 | int word, info; |
32ce6f5e | 59 | |
c48789a9 | 60 | tmaddr = (struct tmdevice *)ubamem(io->i_adapt, tmstd[io->i_ctlr]); |
32ce6f5e BJ |
61 | errcnt = 0; |
62 | retry: | |
99fe9747 | 63 | tmquiet(tmaddr); |
32ce6f5e | 64 | info = ubasetup(io, 1); |
99fe9747 BJ |
65 | tmaddr->tmbc = -io->i_cc; |
66 | tmaddr->tmba = info; | |
c48789a9 | 67 | com = (io->i_unit<<8) | TM_GO; |
32ce6f5e | 68 | if (func == READ) |
c48789a9 | 69 | tmaddr->tmcs = com | TM_RCOM; |
32ce6f5e | 70 | else if (func == WRITE) |
c48789a9 | 71 | tmaddr->tmcs = com | TM_WCOM; |
99fe9747 BJ |
72 | else if (func == TM_SREV) { |
73 | tmaddr->tmbc = -1; | |
c48789a9 | 74 | tmaddr->tmcs = com | TM_SREV; |
327a6aab | 75 | return (0); |
32ce6f5e | 76 | } else |
c48789a9 | 77 | tmaddr->tmcs = com | func; |
327a6aab | 78 | for (;;) { |
99fe9747 | 79 | word = tmaddr->tmcs; |
d9c4b326 | 80 | DELAY(100); |
33e6c655 | 81 | if (word & TM_CUR) |
327a6aab BJ |
82 | break; |
83 | } | |
99fe9747 BJ |
84 | ubafree(io, info); |
85 | word = tmaddr->tmer; | |
33e6c655 SL |
86 | if (word & TMER_EOT) |
87 | return (0); | |
88 | if (word & TM_ERR) { | |
89 | if (word & TMER_EOF) | |
90 | return (0); | |
c48789a9 KB |
91 | printf("tm tape error: er=%b\n", word, TMER_BITS); |
92 | if (errcnt++ == 10) { | |
93 | printf("tm: unrecovered error\n"); | |
33e6c655 | 94 | return (-1); |
32ce6f5e | 95 | } |
99fe9747 | 96 | tmstrategy(io, TM_SREV); |
32ce6f5e BJ |
97 | goto retry; |
98 | } | |
99 | if (errcnt) | |
c48789a9 | 100 | printf("tm: recovered by retry\n"); |
33e6c655 SL |
101 | if (word & TMER_EOF) |
102 | return (0); | |
103 | return (io->i_cc + tmaddr->tmbc); | |
32ce6f5e BJ |
104 | } |
105 | ||
99fe9747 | 106 | tmquiet(tmaddr) |
2e0ec09b | 107 | register struct tmdevice *tmaddr; |
32ce6f5e | 108 | { |
327a6aab BJ |
109 | register word; |
110 | for (;;) { | |
99fe9747 | 111 | word = tmaddr->tmcs; |
d9c4b326 | 112 | DELAY(100); |
99fe9747 | 113 | if (word&TM_CUR) |
327a6aab BJ |
114 | break; |
115 | } | |
116 | for (;;) { | |
99fe9747 | 117 | word = tmaddr->tmer; |
d9c4b326 | 118 | DELAY(100); |
99fe9747 | 119 | if ((word&TMER_TUR) && (word&TMER_SDWN)==0) |
327a6aab BJ |
120 | break; |
121 | } | |
32ce6f5e | 122 | } |