controlling tty moved out of user to session
[unix-history] / usr / src / sys / vax / stand / tm.c
CommitLineData
da7c5cc6 1/*
99152021 2 * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
da7c5cc6
KM
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
a16d7bdb 6 * @(#)tm.c 7.6 (Berkeley) %G%
da7c5cc6 7 */
99fe9747 8
32ce6f5e 9/*
99fe9747 10 * TM11/TE??
32ce6f5e
BJ
11 */
12
39c71180 13#include "param.h"
a031a31b 14
99152021
MK
15#include "../vax/pte.h"
16
a031a31b
SL
17#include "../vaxuba/ubareg.h"
18#include "../vaxuba/tmreg.h"
19
32ce6f5e 20#include "saio.h"
99fe9747 21#include "savax.h"
32ce6f5e 22
c48789a9
KB
23#define MAXCTLR 1 /* all addresses must be specified */
24u_short tmstd[MAXCTLR] = { 0172520 };
32ce6f5e
BJ
25
26tmopen(io)
327a6aab 27 register struct iob *io;
32ce6f5e 28{
c48789a9 29 register int skip;
32ce6f5e 30
99152021
MK
31 if ((u_int)io->i_adapt >= nuba)
32 return (EADAPT);
c48789a9
KB
33 if ((u_int)io->i_ctlr >= MAXCTLR)
34 return (ECTLR);
9ab9be08 35 if (badaddr((char *)ubamem(io->i_adapt, tmstd[io->i_ctlr]), sizeof(short)))
39c71180 36 return (ENXIO);
99fe9747 37 tmstrategy(io, TM_REW);
c48789a9 38 for (skip = io->i_part; skip--;) {
32ce6f5e 39 io->i_cc = 0;
78a7384b 40 tmstrategy(io, TM_SFORW);
32ce6f5e 41 }
39c71180 42 return (0);
32ce6f5e
BJ
43}
44
45tmclose(io)
327a6aab 46 register struct iob *io;
32ce6f5e 47{
99fe9747 48 tmstrategy(io, TM_REW);
32ce6f5e
BJ
49}
50
51tmstrategy(io, func)
327a6aab 52 register struct iob *io;
32ce6f5e 53{
c48789a9
KB
54 register int com, errcnt;
55 register struct tmdevice *tmaddr;
99fe9747 56 int word, info;
32ce6f5e 57
c48789a9 58 tmaddr = (struct tmdevice *)ubamem(io->i_adapt, tmstd[io->i_ctlr]);
32ce6f5e
BJ
59 errcnt = 0;
60retry:
99fe9747 61 tmquiet(tmaddr);
32ce6f5e 62 info = ubasetup(io, 1);
99fe9747
BJ
63 tmaddr->tmbc = -io->i_cc;
64 tmaddr->tmba = info;
c48789a9 65 com = (io->i_unit<<8) | TM_GO;
32ce6f5e 66 if (func == READ)
c48789a9 67 tmaddr->tmcs = com | TM_RCOM;
32ce6f5e 68 else if (func == WRITE)
c48789a9 69 tmaddr->tmcs = com | TM_WCOM;
99fe9747
BJ
70 else if (func == TM_SREV) {
71 tmaddr->tmbc = -1;
c48789a9 72 tmaddr->tmcs = com | TM_SREV;
327a6aab 73 return (0);
32ce6f5e 74 } else
c48789a9 75 tmaddr->tmcs = com | func;
327a6aab 76 for (;;) {
99fe9747 77 word = tmaddr->tmcs;
d9c4b326 78 DELAY(100);
33e6c655 79 if (word & TM_CUR)
327a6aab
BJ
80 break;
81 }
99fe9747
BJ
82 ubafree(io, info);
83 word = tmaddr->tmer;
33e6c655
SL
84 if (word & TMER_EOT)
85 return (0);
86 if (word & TM_ERR) {
87 if (word & TMER_EOF)
88 return (0);
c48789a9
KB
89 printf("tm tape error: er=%b\n", word, TMER_BITS);
90 if (errcnt++ == 10) {
91 printf("tm: unrecovered error\n");
33e6c655 92 return (-1);
32ce6f5e 93 }
99fe9747 94 tmstrategy(io, TM_SREV);
32ce6f5e
BJ
95 goto retry;
96 }
97 if (errcnt)
c48789a9 98 printf("tm: recovered by retry\n");
33e6c655
SL
99 if (word & TMER_EOF)
100 return (0);
101 return (io->i_cc + tmaddr->tmbc);
32ce6f5e
BJ
102}
103
99fe9747 104tmquiet(tmaddr)
2e0ec09b 105 register struct tmdevice *tmaddr;
32ce6f5e 106{
327a6aab
BJ
107 register word;
108 for (;;) {
99fe9747 109 word = tmaddr->tmcs;
d9c4b326 110 DELAY(100);
99fe9747 111 if (word&TM_CUR)
327a6aab
BJ
112 break;
113 }
114 for (;;) {
99fe9747 115 word = tmaddr->tmer;
d9c4b326 116 DELAY(100);
99fe9747 117 if ((word&TMER_TUR) && (word&TMER_SDWN)==0)
327a6aab
BJ
118 break;
119 }
32ce6f5e 120}