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: extern int tapemark; /* flag to indicate tapemark
43: has been encountered (see SYS.c) */
44:
45:
46: tmrew(io)
47: register struct iob *io;
48: {
49: tmstrategy(io, REW);
50: }
51:
52: tmopen(io)
53: register struct iob *io;
54: {
55: register skip;
56:
57: tmstrategy(io, REW);
58: skip = io->i_boff;
59: while (skip--) {
60: io->i_cc = 0;
61: while (tmstrategy(io, SFORW))
62: ;
63: }
64: }
65: tmstrategy(io, func)
66: register struct iob *io;
67: {
68: register int com, unit, errcnt;
69:
70: unit = io->i_unit;
71: errcnt = 0;
72: retry:
73: tmquiet();
74: com = (unit<<8)|(segflag<<4)|DENS;
75: TMADDR->tmbc = -io->i_cc;
76: TMADDR->tmba = io->i_ma;
77: if (func == READ)
78: TMADDR->tmcs = com | RCOM | GO;
79: else if (func == WRITE)
80: TMADDR->tmcs = com | WCOM | GO;
81: else if (func == SREV) {
82: TMADDR->tmbc = -1;
83: TMADDR->tmcs = com | SREV | GO;
84: return(0);
85: } else
86: TMADDR->tmcs = com | func | GO;
87: while ((TMADDR->tmcs&CRDY) == 0)
88: ;
89: if (TMADDR->tmer&EOF)
90: {
91: tapemark=1;
92: return(0);
93: }
94: if (TMADDR->tmer < 0) {
95: if (errcnt == 0)
96: printf("tape error: er=%o", TMADDR->tmer);
97: if (errcnt==10) {
98: printf("\n");
99: return(-1);
100: }
101: errcnt++;
102: tmstrategy(io, SREV);
103: goto retry;
104: }
105: if (errcnt)
106: printf(" recovered by retry\n");
107: return( io->i_cc+TMADDR->tmbc );
108: }
109:
110: tmquiet()
111: {
112: while ((TMADDR->tmcs&CRDY) == 0)
113: ;
114: while ((TMADDR->tmer&TUR) == 0)
115: ;
116: while ((TMADDR->tmer&SDWN) != 0)
117: ;
118: }
Defined functions
tmrew
defined in line
46; 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