|
|
1.1 root 1: /*
2: * TJU16 tape driver
3: */
4:
5: #include "../h/param.h"
6: #include "../h/inode.h"
7: #include "../h/mba.h"
8: #include "saio.h"
9:
10: struct device
11: {
12: int htcs1;
13: int htds;
14: int hter;
15: int htmr;
16: int htas;
17: int htfc;
18: int htdt;
19: int htck;
20: int htsn;
21: int httc;
22: };
23:
24: #define HTADDR ((struct device *)(PHYSMBA1 + MBA_ERB))
25:
26: #define GO 01
27: #define WCOM 060
28: #define RCOM 070
29: #define NOP 0
30: #define WEOF 026
31: #define SFORW 030
32: #define SREV 032
33: #define ERASE 024
34: #define REW 06
35: #define DCLR 010
36: #define P800 01700 /* 800 + pdp11 mode */
37: #define P1600 02300 /* 1600 + pdp11 mode */
38: #define IENABLE 0100
39: #define RDY 0200
40: #define TM 04
41: #define DRY 0200
42: #define EOT 02000
43: #define CS 02000
44: #define COR 0100000
45: #define PES 040
46: #define WRL 04000
47: #define MOL 010000
48: #define ERR 040000
49: #define FCE 01000
50: #define TRE 040000
51: #define HARD 064023 /* UNS|OPI|NEF|FMT|RMR|ILR|ILF */
52:
53: #define SIO 1
54: #define SSFOR 2
55: #define SSREV 3
56: #define SRETRY 4
57: #define SCOM 5
58: #define SOK 6
59:
60: htopen(io)
61: register struct iob *io;
62: {
63: register skip;
64: int i;
65:
66: htinit();
67: htstrategy(io, REW);
68: skip = io->i_boff;
69: while (skip--) {
70: io->i_cc = -1;
71: while (htstrategy(io, SFORW))
72: ;
73: i = 65536;
74: while (--i)
75: ;
76: htstrategy(io, NOP);
77: }
78: }
79:
80: htclose(io)
81: register struct iob *io;
82: {
83: htstrategy(io, REW);
84: }
85:
86: htstrategy(io, func)
87: register struct iob *io;
88: {
89: register int unit, den, errcnt, ds;
90: short fc;
91:
92: unit = io->i_unit;
93: errcnt = 0;
94: retry:
95: if(unit & 1)
96: den = P1600;
97: else
98: den = P800;
99: htquiet();
100: if((HTADDR->httc&03777) != den)
101: HTADDR->httc = den;
102: HTADDR->htfc = -io->i_cc;
103: if (func == SREV) {
104: HTADDR->htfc = -1;
105: HTADDR->htcs1 = SREV | GO;
106: return(0);
107: }
108: if (func == READ || func == WRITE)
109: mbastart(io, HTADDR, func);
110: else
111: HTADDR->htcs1 = func | GO;
112: htquiet();
113: ds = HTADDR->htds & TM;
114: if (ds&TM) {
115: htinit();
116: return(0);
117: }
118: if (ds&ERR) {
119: if (errcnt == 0)
120: printf("tape error: ds=%x, er=%x, mbasr=%x",
121: HTADDR->htds, HTADDR->hter, PHYSMBA1->mba_sr);
122: htinit();
123: if (errcnt == 10) {
124: printf("\n");
125: return(-1);
126: }
127: errcnt++;
128: htstrategy(io, SREV);
129: goto retry;
130: }
131: if (errcnt)
132: printf(" recovered by retry\n");
133: fc = HTADDR->htfc;
134: return(io->i_cc+fc);
135: }
136:
137: htinit()
138: {
139:
140: HTADDR->htcs1 = DCLR|GO;
141: }
142:
143: htquiet()
144: {
145: register int s;
146:
147: do
148: s = HTADDR->htds;
149: while ((s & RDY) == 0);
150: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.