|
|
1.1 root 1: /* tm.c 6.1 83/07/29 */
2:
3: /*
4: * TM11/TE??
5: */
6: #include "../machine/pte.h"
7:
8: #include "../h/param.h"
9: #include "../h/inode.h"
10: #include "../h/fs.h"
11:
12: #include "../vaxuba/ubareg.h"
13: #include "../vaxuba/tmreg.h"
14:
15: #include "saio.h"
16: #include "savax.h"
17:
18:
19: u_short tmstd[] = { 0172520 };
20:
21: tmopen(io)
22: register struct iob *io;
23: {
24: register skip;
25:
26: tmstrategy(io, TM_REW);
27: skip = io->i_boff;
28: while (skip--) {
29: io->i_cc = 0;
30: tmstrategy(io, TM_SFORW);
31: }
32: }
33:
34: tmclose(io)
35: register struct iob *io;
36: {
37:
38: tmstrategy(io, TM_REW);
39: }
40:
41: tmstrategy(io, func)
42: register struct iob *io;
43: {
44: register int com, unit, errcnt;
45: register struct tmdevice *tmaddr =
46: (struct tmdevice *)ubamem(io->i_unit, tmstd[0]);
47: int word, info;
48:
49: unit = io->i_unit;
50: errcnt = 0;
51: retry:
52: tmquiet(tmaddr);
53: com = (unit<<8);
54: info = ubasetup(io, 1);
55: tmaddr->tmbc = -io->i_cc;
56: tmaddr->tmba = info;
57: if (func == READ)
58: tmaddr->tmcs = com | TM_RCOM | TM_GO;
59: else if (func == WRITE)
60: tmaddr->tmcs = com | TM_WCOM | TM_GO;
61: else if (func == TM_SREV) {
62: tmaddr->tmbc = -1;
63: tmaddr->tmcs = com | TM_SREV | TM_GO;
64: return (0);
65: } else
66: tmaddr->tmcs = com | func | TM_GO;
67: for (;;) {
68: word = tmaddr->tmcs;
69: DELAY(100);
70: if (word & TM_CUR)
71: break;
72: }
73: ubafree(io, info);
74: word = tmaddr->tmer;
75: if (word & TMER_EOT)
76: return (0);
77: if (word & TM_ERR) {
78: if (word & TMER_EOF)
79: return (0);
80: if (errcnt == 0)
81: printf("te error: er=%b", word, TMER_BITS);
82: if (errcnt == 10) {
83: printf("\n");
84: return (-1);
85: }
86: errcnt++;
87: tmstrategy(io, TM_SREV);
88: goto retry;
89: }
90: if (errcnt)
91: printf(" recovered by retry\n");
92: if (word & TMER_EOF)
93: return (0);
94: return (io->i_cc + tmaddr->tmbc);
95: }
96:
97: tmquiet(tmaddr)
98: register struct tmdevice *tmaddr;
99: {
100: register word;
101: for (;;) {
102: word = tmaddr->tmcs;
103: DELAY(100);
104: if (word&TM_CUR)
105: break;
106: }
107: for (;;) {
108: word = tmaddr->tmer;
109: DELAY(100);
110: if ((word&TMER_TUR) && (word&TMER_SDWN)==0)
111: break;
112: }
113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.