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