eliminate floating point from the kernel (from forys@cs.utah.edu)
[unix-history] / usr / src / sys / vax / stand / ht.c
CommitLineData
8ae0e4b4 1/*
0880b18e 2 * Copyright (c) 1982, 1986 Regents of the University of California.
8ae0e4b4
KM
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
c18e27ed 6 * @(#)ht.c 7.4 (Berkeley) %G%
8ae0e4b4 7 */
fbfcdb0a
BJ
8
9/*
2d19f71b 10 * TM03/TU?? tape driver
fbfcdb0a 11 */
c18e27ed 12#include "machine/pte.h"
fbfcdb0a 13
39c71180
MK
14#include "param.h"
15#include "inode.h"
16#include "fs.h"
a031a31b
SL
17
18#include "../vaxmba/htreg.h"
19#include "../vaxmba/mbareg.h"
20
fbfcdb0a 21#include "saio.h"
2d19f71b 22#include "savax.h"
fbfcdb0a 23
10899d3a
BJ
24short httypes[] =
25 { MBDT_TM03, MBDT_TE16, MBDT_TU45, MBDT_TU77, 0 };
26
27#define MASKREG(reg) ((reg)&0xffff)
28
fbfcdb0a 29htopen(io)
2d19f71b 30 register struct iob *io;
fbfcdb0a 31{
49c2f2f8
KB
32 register struct htdevice *htaddr;
33 register int i, skip;
fbfcdb0a 34
49c2f2f8
KB
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 }
10899d3a 43 if (httypes[i] == (htaddr->htdt&MBDT_TYPE))
49c2f2f8
KB
44 break;
45 }
2d19f71b
BJ
46 htaddr->htcs1 = HT_DCLR|HT_GO;
47 htstrategy(io, HT_REW);
49c2f2f8 48 for (skip = io->i_part; skip--;) {
fbfcdb0a 49 io->i_cc = -1;
49c2f2f8 50 while (htstrategy(io, HT_SFORW));
2d19f71b
BJ
51 DELAY(65536);
52 htstrategy(io, HT_SENSE);
fbfcdb0a 53 }
39c71180 54 return (0);
fbfcdb0a
BJ
55}
56
57htclose(io)
2d19f71b 58 register struct iob *io;
fbfcdb0a 59{
2d19f71b 60 htstrategy(io, HT_REW);
fbfcdb0a
BJ
61}
62
63htstrategy(io, func)
2d19f71b
BJ
64 register struct iob *io;
65 int func;
fbfcdb0a 66{
49c2f2f8 67 register struct htdevice *htaddr;
2d19f71b 68 register int den, errcnt, ds;
cc00b603 69 int er;
fbfcdb0a
BJ
70 short fc;
71
fbfcdb0a 72 errcnt = 0;
49c2f2f8 73 htaddr = (struct htdevice *)mbadrv(io->i_adapt, io->i_ctlr);
fbfcdb0a 74retry:
49c2f2f8 75 den = HTTC_1600BPI | HTTC_PDP11 | io->i_unit;
2d19f71b 76 htquiet(htaddr);
10899d3a 77 htaddr->htcs1 = HT_DCLR|HT_GO;
2d19f71b
BJ
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);
fbfcdb0a 84 }
610c6f01 85 if (func == READ || func == WRITE)
49c2f2f8 86 mbastart(io, io->i_ctlr, func);
fbfcdb0a 87 else
2d19f71b
BJ
88 htaddr->htcs1 = func|HT_GO;
89 htquiet(htaddr);
90 ds = htaddr->htds;
cc00b603 91 er = htaddr->hter;
2d19f71b
BJ
92 if (ds & HTDS_TM) {
93 htaddr->htcs1 = HT_DCLR|HT_GO;
94 return (0);
fbfcdb0a 95 }
2d19f71b 96 if (ds & HTDS_ERR) {
2d19f71b 97 htaddr->htcs1 = HT_DCLR|HT_GO;
cc00b603
BJ
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);
49c2f2f8 102 if (errcnt++ == 10) {
cc00b603
BJ
103 printf("ht: unrecovered error\n");
104 return (-1);
105 }
cc00b603
BJ
106 htstrategy(io, HT_SREV);
107 goto retry;
fbfcdb0a 108 }
fbfcdb0a
BJ
109 }
110 if (errcnt)
10899d3a 111 printf("ht: recovered by retry\n");
2d19f71b
BJ
112 fc = htaddr->htfc;
113 return (io->i_cc+fc);
fbfcdb0a
BJ
114}
115
49c2f2f8 116static
2d19f71b
BJ
117htquiet(htaddr)
118 register struct htdevice *htaddr;
fbfcdb0a
BJ
119{
120 register int s;
121
122 do
2d19f71b
BJ
123 s = htaddr->htds;
124 while ((s & HTDS_DRY) == 0);
e63bbd8c 125}