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