|
|
1.1 root 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.3 (Berkeley) 2/22/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 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.