1: #
2:
3: /*
4: * TM tape driver
5: */
6:
7: #include <sys/param.h>
8: #include <sys/inode.h>
9: #include "saio.h"
10:
11: struct device {
12: int tmer;
13: int tmcs;
14: int tmbc;
15: char *tmba;
16: int tmdb;
17: int tmrd;
18: };
19:
20: #define TMADDR ((struct device *)0172520)
21:
22: #define GO 01
23: #define RCOM 02
24: #define WCOM 04
25: #define WEOF 06
26: #define SFORW 010
27: #define SREV 012
28: #define WIRG 014
29: #define REW 016
30: #define DENS 060000 /* 9-channel */
31: #define IENABLE 0100
32: #define CRDY 0200
33: #define GAPSD 010000
34: #define TUR 1
35: #define SDWN 010
36: #define HARD 0102200 /* ILC, EOT, NXM */
37: #define EOF 0040000
38:
39: #define SSEEK 1
40: #define SIO 2
41:
42:
43: tmrew(io)
44: register struct iob *io;
45: {
46: tmstrategy(io, REW);
47: }
48:
49: tmopen(io)
50: register struct iob *io;
51: {
52: register skip;
53:
54: tmstrategy(io, REW);
55: skip = io->i_boff;
56: while (skip--) {
57: io->i_cc = 0;
58: while (tmstrategy(io, SFORW))
59: ;
60: }
61: }
62: tmstrategy(io, func)
63: register struct iob *io;
64: {
65: register int com, unit, errcnt;
66:
67: unit = io->i_unit;
68: errcnt = 0;
69: retry:
70: tmquiet();
71: com = (unit<<8)|(segflag<<4)|DENS;
72: TMADDR->tmbc = -io->i_cc;
73: TMADDR->tmba = io->i_ma;
74: if (func == READ)
75: TMADDR->tmcs = com | RCOM | GO;
76: else if (func == WRITE)
77: TMADDR->tmcs = com | WCOM | GO;
78: else if (func == SREV) {
79: TMADDR->tmbc = -1;
80: TMADDR->tmcs = com | SREV | GO;
81: return(0);
82: } else
83: TMADDR->tmcs = com | func | GO;
84: while ((TMADDR->tmcs&CRDY) == 0)
85: ;
86: if (TMADDR->tmer&EOF)
87: return(0);
88: if (TMADDR->tmer < 0) {
89: if (errcnt == 0)
90: printf("tape error: er=%o", TMADDR->tmer);
91: if (errcnt==10) {
92: printf("\n");
93: return(-1);
94: }
95: errcnt++;
96: tmstrategy(io, SREV);
97: goto retry;
98: }
99: if (errcnt)
100: printf(" recovered by retry\n");
101: return( io->i_cc+TMADDR->tmbc );
102: }
103:
104: tmquiet()
105: {
106: while ((TMADDR->tmcs&CRDY) == 0)
107: ;
108: while ((TMADDR->tmer&TUR) == 0)
109: ;
110: while ((TMADDR->tmer&SDWN) != 0)
111: ;
112: }
Defined functions
tmrew
defined in line
43; used 2 times
Defined struct's
Defined macros
CRDY
defined in line
32; used 2 times
DENS
defined in line
30; used 1 times
EOF
defined in line
37; used 1 times
GAPSD
defined in line
33;
never used
GO
defined in line
22; used 4 times
HARD
defined in line
36;
never used
RCOM
defined in line
23; used 1 times
REW
defined in line
29; used 2 times
SDWN
defined in line
35; used 1 times
SFORW
defined in line
26; used 1 times
SIO
defined in line
40;
never used
SREV
defined in line
27; used 3 times
SSEEK
defined in line
39;
never used
TMADDR
defined in line
20; used 15 times
TUR
defined in line
34; used 1 times
WCOM
defined in line
24; used 1 times
WEOF
defined in line
25;
never used
WIRG
defined in line
28;
never used