mv pcs750.bin to /usr/src/etc/vax
[unix-history] / usr / src / sys / vax / stand / tm.c
CommitLineData
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 */
26u_short tmstd[MAXCTLR] = { 0172520 };
32ce6f5e
BJ
27
28tmopen(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
47tmclose(io)
327a6aab 48 register struct iob *io;
32ce6f5e 49{
99fe9747 50 tmstrategy(io, TM_REW);
32ce6f5e
BJ
51}
52
53tmstrategy(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;
62retry:
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 106tmquiet(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}