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