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