xref: /original-bsd/sys/vax/stand/ht.c (revision 7a2b7612)
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.4 (Berkeley) 04/25/89
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 struct htdevice *htaddr;
33 	register int i, skip;
34 
35 	htaddr = (struct htdevice *)mbadrv(io->i_adapt, io->i_ctlr);
36 	if (mbainit(io->i_adapt) == 0)
37 		return (EADAPT);
38 	for (i = 0;; i++) {
39 		if (!httypes[i]) {
40 			printf("ht: not a tape\n");
41 			return (ENXIO);
42 		}
43 		if (httypes[i] == (htaddr->htdt&MBDT_TYPE))
44 			break;
45 	}
46 	htaddr->htcs1 = HT_DCLR|HT_GO;
47 	htstrategy(io, HT_REW);
48 	for (skip = io->i_part; skip--;) {
49 		io->i_cc = -1;
50 		while (htstrategy(io, HT_SFORW));
51 		DELAY(65536);
52 		htstrategy(io, HT_SENSE);
53 	}
54 	return (0);
55 }
56 
57 htclose(io)
58 	register struct iob *io;
59 {
60 	htstrategy(io, HT_REW);
61 }
62 
63 htstrategy(io, func)
64 	register struct iob *io;
65 	int func;
66 {
67 	register struct htdevice *htaddr;
68 	register int den, errcnt, ds;
69 	int er;
70 	short fc;
71 
72 	errcnt = 0;
73 	htaddr = (struct htdevice *)mbadrv(io->i_adapt, io->i_ctlr);
74 retry:
75 	den = HTTC_1600BPI | HTTC_PDP11 | io->i_unit;
76 	htquiet(htaddr);
77 	htaddr->htcs1 = HT_DCLR|HT_GO;
78 	htaddr->httc = den;
79 	htaddr->htfc = -io->i_cc;
80 	if (func == HT_SREV) {
81 		htaddr->htfc = -1;
82 		htaddr->htcs1 = HT_SREV|HT_GO;
83 		return (0);
84 	}
85 	if (func == READ || func == WRITE)
86 		mbastart(io, io->i_ctlr, func);
87 	else
88 		htaddr->htcs1 = func|HT_GO;
89 	htquiet(htaddr);
90 	ds = htaddr->htds;
91 	er = htaddr->hter;
92 	if (ds & HTDS_TM) {
93 		htaddr->htcs1 = HT_DCLR|HT_GO;
94 		return (0);
95 	}
96 	if (ds & HTDS_ERR) {
97 		htaddr->htcs1 = HT_DCLR|HT_GO;
98 		if ((er & HTER_CORCRC) == 0) {
99 			printf("ht error: ds=%b, er=%b\n",
100 			    MASKREG(ds), HTDS_BITS,
101 			    MASKREG(er), HTER_BITS);
102 			if (errcnt++ == 10) {
103 				printf("ht: unrecovered error\n");
104 				return (-1);
105 			}
106 			htstrategy(io, HT_SREV);
107 			goto retry;
108 		}
109 	}
110 	if (errcnt)
111 		printf("ht: recovered by retry\n");
112 	fc = htaddr->htfc;
113 	return (io->i_cc+fc);
114 }
115 
116 static
117 htquiet(htaddr)
118 	register struct htdevice *htaddr;
119 {
120 	register int s;
121 
122 	do
123 		s = htaddr->htds;
124 	while ((s & HTDS_DRY) == 0);
125 }
126