xref: /original-bsd/sys/vax/stand/ht.c (revision 76571ef5)
1 /*	ht.c	4.6	81/12/01	*/
2 
3 /*
4  * TM03/TU?? tape driver
5  */
6 
7 #include "../h/htreg.h"
8 #include "../h/param.h"
9 #include "../h/inode.h"
10 #include "../h/pte.h"
11 #include "../h/mbareg.h"
12 #include "saio.h"
13 #include "savax.h"
14 
15 short	httypes[] =
16 	{ MBDT_TM03, MBDT_TE16, MBDT_TU45, MBDT_TU77, 0 };
17 
18 #define	MASKREG(reg)	((reg)&0xffff)
19 
20 htopen(io)
21 	register struct iob *io;
22 {
23 	register int skip;
24 	register struct htdevice *htaddr = (struct htdevice *)mbadrv(io->i_unit);
25 	int i;
26 
27 	for (i = 0; httypes[i]; i++)
28 		if (httypes[i] == (htaddr->htdt&MBDT_TYPE))
29 			goto found;
30 	_stop("not a tape\n");
31 found:
32 	mbainit(UNITTOMBA(io->i_unit));
33 	htaddr->htcs1 = HT_DCLR|HT_GO;
34 	htstrategy(io, HT_REW);
35 	skip = io->i_boff;
36 	while (skip--) {
37 		io->i_cc = -1;
38 		while (htstrategy(io, HT_SFORW))
39 			;
40 		DELAY(65536);
41 		htstrategy(io, HT_SENSE);
42 	}
43 }
44 
45 htclose(io)
46 	register struct iob *io;
47 {
48 
49 	htstrategy(io, HT_REW);
50 }
51 
52 htstrategy(io, func)
53 	register struct iob *io;
54 	int func;
55 {
56 	register int den, errcnt, ds;
57 	int er;
58 	short fc;
59 	register struct htdevice *htaddr =
60 	    (struct htdevice *)mbadrv(io->i_unit);
61 
62 	errcnt = 0;
63 retry:
64 	den = HTTC_1600BPI|HTTC_PDP11;
65 	htquiet(htaddr);
66 	htaddr->htcs1 = HT_DCLR|HT_GO;
67 	htaddr->httc = den;
68 	htaddr->htfc = -io->i_cc;
69 	if (func == HT_SREV) {
70 		htaddr->htfc = -1;
71 		htaddr->htcs1 = HT_SREV|HT_GO;
72 		return (0);
73 	}
74 	if (func == READ || func == WRITE)
75 		mbastart(io, func);
76 	else
77 		htaddr->htcs1 = func|HT_GO;
78 	htquiet(htaddr);
79 	ds = htaddr->htds;
80 	er = htaddr->hter;
81 	if (ds & HTDS_TM) {
82 		htaddr->htcs1 = HT_DCLR|HT_GO;
83 		return (0);
84 	}
85 	if (ds & HTDS_ERR) {
86 		htaddr->htcs1 = HT_DCLR|HT_GO;
87 		if ((er & HTER_CORCRC) == 0) {
88 			printf("ht error: ds=%b, er=%b\n",
89 			    MASKREG(ds), HTDS_BITS,
90 			    MASKREG(er), HTER_BITS);
91 			if (errcnt == 10) {
92 				printf("ht: unrecovered error\n");
93 				return (-1);
94 			}
95 			errcnt++;
96 			htstrategy(io, HT_SREV);
97 			goto retry;
98 		}
99 	}
100 	if (errcnt)
101 		printf("ht: recovered by retry\n");
102 	fc = htaddr->htfc;
103 	return (io->i_cc+fc);
104 }
105 
106 htquiet(htaddr)
107 	register struct htdevice *htaddr;
108 {
109 	register int s;
110 
111 	do
112 		s = htaddr->htds;
113 	while ((s & HTDS_DRY) == 0);
114 }
115 
116 
117