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