1: /*
2: * standalone TS11 - 1600 bpi tape driver
3: */
4:
5:
6: #include <sys/param.h>
7: #include <sys/inode.h>
8: #include "../saio.h"
9:
10: extern int tapemark; /* flag to indicate tapemark encountered
11: (see SYS.c as to how its used) */
12:
13: int cmdpkt[5]; /* command packet. extra location is mod 4 alignment */
14:
15: struct device
16: {
17: int tsdb; /* TS data buffer and bus address reg */
18: int tssr; /* TS status register */
19: };
20:
21: struct mespkt
22: {
23: int mshdr; /* message packet header word */
24: int mssiz; /* size of message returned */
25: int msresid; /* remaining count register */
26: int mstsx0; /* extended status reg 0 */
27: int mstsx1; /* extended status reg 1 */
28: int mstsx2; /* extneded status reg 2 */
29: int mstsx3; /* extended status reg 3 */
30: };
31:
32: struct compkt
33: {
34: int tscom; /* command packet command word */
35: int tsba; /* memory address */
36: int tsbae; /* extended address */
37: int tswc; /* byte count, record count, etc. */
38: };
39:
40: struct chrdat
41: {
42: int msbptr; /* pointer to message buffer */
43: int msbae; /* hi address (bits 16 & 17) */
44: int msbsiz; /* size of message buffer */
45: int mschar; /* characteristics word */
46: };
47:
48: int tsptr;
49: struct chrdat chrbuf; /* characteristics buffer */
50: struct mespkt mesbuf; /* message buffer */
51:
52:
53:
54: #define TSADDR ((struct device *)0172520)
55: /* The following 3 lines are necessary to align com buffer on mod 4 */
56: #define t_temp (&cmdpkt[1]) /* get address of cmdpkt +2 */
57: #define t_temp1 (t_temp & 0177776)
58: #define combuf ((struct compkt *)t_temp1)
59:
60:
61: /* bit definitions for command word in ts command packet */
62:
63: #define ACK 0100000 /* acknowledge bit */
64: #define CVC 040000 /* clear volume check */
65: #define OPP 020000 /* opposite. reverse recovery */
66: #define SWB 010000 /* swap bytes. for data xfer */
67: /* bit definitions for Command mode field during read command */
68: #define RNEXT 0 /* read next (forward) */
69: #define RPREV 0400 /* read previous (reverse) */
70: #define RRPRV 01000 /* reread previous (space rev, read two) */
71: #define RRNXT 01400 /* reread next (space fwd, read rev) */
72: /* bit definitions for Command mode field during write command */
73: #define WNEXT 0 /* Write data next */
74: #define WDRTY 01000 /* write data retry , space rev, erase, write data) */
75: /* bit definitions for command mode field during position command */
76: #define SPCFWD 0 /* space records forward */
77: #define SPCREV 0400 /* space records reverse */
78: #define SKTPF 01000 /* skip tape marks forward */
79: #define SKTPR 01400 /* skip tape marks reverse */
80: #define RWIND 02000 /* rewind */
81:
82: /* bit definitions for command mode field during format command */
83: #define WEOF 0 /* write tape mark */
84: #define ERAS 0400 /* erase */
85: #define WEOFE 01000 /* write tape mark entry */
86: /* bit definitions for command mode field during control command */
87: #define MBREAL 0 /* message buffer release */
88: #define REWUNL 0400 /* Rewind and unload */
89: #define CLEAN 01000 /* clean */
90: /* additional definitions */
91: #define IEI 0200 /* interrupt enable bit */
92:
93: /* command code definitions */
94: #define NOP 0
95: #define RCOM 01 /* read command */
96: #define WCHAR 04 /* write characteristics */
97: #define WCOM 05 /* write */
98: #define WSUSM 06 /* write subsystem memory */
99: #define POSIT 010 /* position command */
100: #define FORMT 011 /* Format command */
101: #define CONTRL 012 /* Control command */
102: #define INIT 013 /* initialize */
103: #define GSTAT 017 /* get status immediate */
104:
105:
106: /* definition of tssr bits */
107: #define SC 0100000 /* special condition */
108: #define UPE 040000 /* unibus parity error */
109: #define SPE 020000 /* Serial bus parity error */
110: #define RMR 010000 /* register modify refused */
111: #define NXM 04000 /* non-existent memory */
112: #define NBA 02000 /* Need Buffer address */
113: #define SSR 0200 /* Sub-System ready */
114: #define OFL 0100 /* off-line */
115:
116: /* fatal termination class codes */
117: #define FTC 030 /* use this as a mask to get codes */
118: /* code = 00 see error code byte in tsx3 */
119: /* code = 01 I/O seq Crom or main Crom parity error */
120: /* code = 10 u-processor Crom parity error,I/O silo parity */
121: /* serial bus parity, or other fatal */
122: /* code = 11 A/C low. drive ac low */
123:
124: /* termination class codes */
125: #define TCC 016 /* mask for termination class codes */
126: /* code = 000 normal termination */
127: /* code = 001 Attention condition
128: /* code = 010 Tape status alert
129: /* code = 011 Function reject
130: /* code = 100 Recoverable error - tape pos = 1 record down from
131: start of function
132: /* code = 101 Recoverable error - tape has not moved
133: /* code = 110 Unrecoverable error - tape position lost
134: /* code = 111 Fatal controller error - see fatal class bits */
135:
136: /* definition of message buffer header word */
137: #define MAKC 0100000 /* acknowledge from controller */
138: #define MCCF 07400 /* mask for class code field */
139: /* class codes are */
140: /* 0 = ATTN, on or ofline
141: 1 = ATTN, microdiagnostic failure
142: 0 = FAIL, serial bus parity error
143: 1 = FAIL, WRT LOCK
144: 2 = FAIL, interlock or non-executable function
145: 3 = FAIL, microdiagnostic error
146: */
147:
148: #define MMSC 037 /* mask for message code field */
149: /* message codes are
150: 020 = end
151: 021 = FAIL
152: 022 = ERROR
153: 023 = Attention
154:
155: /* definition of extended status reg 0 bits */
156: #define TMK 0100000 /* Tape mark detected */
157: #define RLS 040000 /* Record length short */
158: #define LET 020000 /* Logical end of Tape */
159: #define RLL 010000 /* Record length long */
160: #define WLE 04000 /* Write lock error */
161: #define NEF 02000 /* Non-executable function */
162: #define ILC 01000 /* Illegal command */
163: #define ILA 0400 /* Illegal address */
164: #define MOT 0200 /* Capistan is moving */
165: #define ONL 0100 /* On Line */
166: #define IE 040 /* state of interrupt enable bit */
167: #define VCK 020 /* Volume Check */
168: #define PED 010 /* Phase encoded drive */
169: #define WLK 04 /* Write locked */
170: #define BOT 02 /* Tape at bot */
171: #define EOT 01 /* Tape at eot */
172:
173: /* definitions of xstat1 */
174: #define DLT 0100000 /* Data late error */
175: #define COR 020000 /* Correctable data error */
176: #define CRS 010000 /* Crease detected */
177: #define TIG 04000 /* Trash in the gap */
178: #define DBF 02000 /* Deskew Buffer Fail */
179: #define SCK 01000 /* Speed check */
180: #define IPR 0200 /* Invalid preamble */
181: #define SYN 0100 /* Synch Failure */
182: #define IPO 040 /* invalid postamble */
183: #define IED 020 /* invalid end data */
184: #define POS 010 /* postamble short */
185: #define POL 04 /* postamble long */
186: #define UNC 02 /* Uncorrectable data error */
187: #define MTE 01 /* multi track error */
188:
189: /* Definitions of XSTAT2 bits */
190: #define OPM 0100000 /* operation in progress (tape moving) */
191: #define SIP 040000 /* Silo Parity error */
192: #define BPE 020000 /* Serial bus Parity error at drive */
193: #define CAF 010000 /* Capstan Acceleration fail */
194: #define WCF 02000 /* Write card error */
195: #define DTP 0477 /* mask for Dead track bits */
196:
197: /* bit definitions for XSTAT3 */
198: #define LMX 0200 /* Limit exceeded (tension arms) */
199: #define OPI 0100 /* operation incomplete */
200: #define REV 040 /* current operation in reverse */
201: #define CRF 020 /* capstan response fail */
202: #define DCK 010 /* density check */
203: #define NOI 04 /* no tape mark or preamble */
204: #define LXS 02 /* limit exceeded manual recovery */
205: #define RIB 01 /* Reverse into BOT */
206:
207:
208: #define SIO 01
209: #define SSEEK 02
210: #define SINIT 04
211: #define SRETRY 010
212: #define SCOM 020
213: #define SOK 040
214: #define SMAST 0100
215:
216: #define S_WRITTEN 1
217:
218: tsopen(io)
219: register struct iob *io;
220: {
221: register skip;
222:
223: tsptr = &combuf->tscom;
224: tsptr |= segflag;
225: combuf->tscom = (ACK|CVC|INIT);
226: TSADDR->tsdb = tsptr;
227: while ((TSADDR->tssr & SSR) == 0);
228: chrbuf.msbptr = &mesbuf;
229: chrbuf.msbae = segflag;
230: chrbuf.msbsiz = 016;
231: chrbuf.mschar = 0;
232: combuf->tscom = (ACK|CVC|WCHAR);
233: combuf->tsba = &chrbuf;
234: combuf->tsbae = segflag;
235: combuf->tswc = 010;
236: TSADDR->tsdb = tsptr;
237: while ((TSADDR->tssr & SSR) == 0);
238: tsstrategy(io,(RWIND|POSIT));
239: skip = io->i_boff;
240: while (skip--)
241: {
242: io->i_cc = 1;
243: while (tsstrategy(io, (SPCFWD|POSIT)));
244: }
245: }
246: tsclose(io)
247: register struct iob *io;
248: {
249: tsstrategy(io,(RWIND|POSIT));
250: }
251: tsstrategy(io, func)
252: register struct iob *io;
253: {
254: register unit, errcnt;
255:
256: unit = io->i_unit;
257: errcnt = 0;
258: combuf->tsba = io->i_ma;
259: combuf->tsbae = segflag;
260: combuf->tswc = io->i_cc;
261: if (func == READ)
262: combuf->tscom = ACK|RNEXT|RCOM;
263: else if (func == WRITE)
264: combuf->tscom = ACK|WNEXT|WCOM;
265: else if (func == SPCREV)
266: {
267: combuf->tscom = ACK|SPCREV|POSIT;
268: combuf->tswc = 1;
269: }
270: else
271: combuf->tscom = ACK|func;
272: TSADDR->tsdb = tsptr;
273: retry:
274: while ((TSADDR->tssr & SSR) == 0);
275: if (mesbuf.mstsx0 & TMK)
276: {
277: tapemark = 1;
278: return(0);
279: }
280: if ((mesbuf.mshdr & MMSC) == 021 || (mesbuf.mshdr & MMSC) == 022)
281: {
282: if(errcnt == 0)
283: printf("tape error: er=%o",mesbuf.mstsx0);
284: if(errcnt == 10)
285: {
286: printf("\n");
287: return(-1);
288: }
289: errcnt++;
290: if(func == READ)
291: combuf->tscom = (ACK|RPREV|RCOM);
292: else if (func == WRITE)
293: combuf->tscom = (ACK|WDRTY|WCOM);
294: else
295: {
296: printf("\n");
297: return(-1);
298: }
299: TSADDR->tsdb = tsptr;
300: goto retry;
301: }
302: if(errcnt)
303: printf(" recovered by retry\n");
304: return (io->i_cc+mesbuf.msresid);
305: }
Defined functions
Defined variables
tsptr
defined in line
48; used 6 times
Defined struct's
Defined macros
ACK
defined in line
63; used 8 times
BOT
defined in line
170;
never used
BPE
defined in line
192;
never used
CAF
defined in line
193;
never used
CLEAN
defined in line
89;
never used
COR
defined in line
175;
never used
CRF
defined in line
201;
never used
CRS
defined in line
176;
never used
CVC
defined in line
64; used 2 times
DBF
defined in line
178;
never used
DCK
defined in line
202;
never used
DLT
defined in line
174;
never used
DTP
defined in line
195;
never used
EOT
defined in line
171;
never used
ERAS
defined in line
84;
never used
FTC
defined in line
117;
never used
IE
defined in line
166;
never used
IED
defined in line
183;
never used
IEI
defined in line
91;
never used
ILA
defined in line
163;
never used
ILC
defined in line
162;
never used
INIT
defined in line
102; used 1 times
IPO
defined in line
182;
never used
IPR
defined in line
180;
never used
LET
defined in line
158;
never used
LMX
defined in line
198;
never used
LXS
defined in line
204;
never used
MAKC
defined in line
137;
never used
MCCF
defined in line
138;
never used
MMSC
defined in line
148; used 2 times
MOT
defined in line
164;
never used
MTE
defined in line
187;
never used
NBA
defined in line
112;
never used
NEF
defined in line
161;
never used
NOI
defined in line
203;
never used
NOP
defined in line
94;
never used
NXM
defined in line
111;
never used
OFL
defined in line
114;
never used
ONL
defined in line
165;
never used
OPI
defined in line
199;
never used
OPM
defined in line
190;
never used
OPP
defined in line
65;
never used
PED
defined in line
168;
never used
POL
defined in line
185;
never used
POS
defined in line
184;
never used
POSIT
defined in line
99; used 4 times
RCOM
defined in line
95; used 2 times
REV
defined in line
200;
never used
RIB
defined in line
205;
never used
RLL
defined in line
159;
never used
RLS
defined in line
157;
never used
RMR
defined in line
110;
never used
RNEXT
defined in line
68; used 1 times
RPREV
defined in line
69; used 1 times
RRNXT
defined in line
71;
never used
RRPRV
defined in line
70;
never used
RWIND
defined in line
80; used 2 times
SC
defined in line
107;
never used
SCK
defined in line
179;
never used
SCOM
defined in line
212;
never used
SIO
defined in line
208;
never used
SIP
defined in line
191;
never used
SKTPF
defined in line
78;
never used
SKTPR
defined in line
79;
never used
SOK
defined in line
213;
never used
SPE
defined in line
109;
never used
SSR
defined in line
113; used 3 times
SWB
defined in line
66;
never used
SYN
defined in line
181;
never used
TCC
defined in line
125;
never used
TIG
defined in line
177;
never used
TMK
defined in line
156; used 1 times
UNC
defined in line
186;
never used
UPE
defined in line
108;
never used
VCK
defined in line
167;
never used
WCF
defined in line
194;
never used
WCHAR
defined in line
96; used 1 times
WCOM
defined in line
97; used 2 times
WDRTY
defined in line
74; used 1 times
WEOF
defined in line
83;
never used
WEOFE
defined in line
85;
never used
WLE
defined in line
160;
never used
WLK
defined in line
169;
never used
WNEXT
defined in line
73; used 1 times
WSUSM
defined in line
98;
never used
combuf
defined in line
58; used 16 times