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