xref: /original-bsd/sys/vax/stand/mt.c (revision 0b685140)
1 /*	mt.c	4.1	81/12/01	*/
2 
3 /*
4  * TM78/TU78 tape driver
5  */
6 
7 #include "../h/mtreg.h"
8 #include "../h/param.h"
9 #include "../h/inode.h"
10 #include "../h/pte.h"
11 #include "../h/mbareg.h"
12 #include "saio.h"
13 #include "savax.h"
14 
15 short	mttypes[] =
16 	{ MBDT_TU78, 0 };
17 
18 #define	MASKREG(reg)	((reg)&0xffff)
19 
20 mtopen(io)
21 	register struct iob *io;
22 {
23 	register int skip;
24 	register struct mtdevice *mtaddr = (struct mtdevice *)mbadrv(io->i_unit);
25 	int i;
26 
27 	for (i = 0; mttypes[i]; i++)
28 		if (mttypes[i] == (mtaddr->mtdt&MBDT_TYPE))
29 			goto found;
30 	_stop("not a tape\n");
31 found:
32 	mbainit(UNITTOMBA(io->i_unit));
33 	mtaddr->mtid = MTID_CLR;
34 	DELAY(250);
35 	while ((mtaddr->mtid & MTID_RDY) == 0)
36 		;
37 	mtstrategy(io, MT_REW);
38 	skip = io->i_boff;
39 	while (skip--) {
40 		io->i_cc = -1;
41 		mtstrategy(io, MT_SFORWF);
42 	}
43 }
44 
45 mtclose(io)
46 	register struct iob *io;
47 {
48 
49 	mtstrategy(io, MT_REW);
50 }
51 
52 mtstrategy(io, func)
53 	register struct iob *io;
54 	int func;
55 {
56 	register int errcnt, s, ic;
57 	register struct mtdevice *mtaddr =
58 	    (struct mtdevice *)mbadrv(io->i_unit);
59 
60 	errcnt = 0;
61 retry:
62 	if (func == READ || func == WRITE) {
63 		mtaddr->mtca = 1<<2;	/* 1 record */
64 		mtaddr->mtbc = io->i_cc;
65 		mtaddr->mter = 0;
66 		mbastart(io, func);
67 		do
68 			s = mtaddr->mter & MTER_INTCODE;
69 		while (s == 0);
70 		ic = s;
71 		DELAY(2000);
72 	} else {
73 		mtaddr->mtas = -1;
74 		mtaddr->mtncs[0] = (-io->i_cc << 8)|func|MT_GO;
75 	rwait:
76 		do
77 			s = mtaddr->mtas&0xffff;
78 		while (s == 0);
79 		mtaddr->mtas = mtaddr->mtas;	/* clear attention */
80 		ic = mtaddr->mtner & MTER_INTCODE;
81 	}
82 	switch (ic) {
83 	case MTER_TM:
84 	case MTER_EOT:
85 	case MTER_LEOT:
86 		return (0);
87 
88 	case MTER_DONE:
89 		break;
90 
91 	case MTER_RWDING:
92 		goto rwait;
93 	default:
94 		printf("mt hard error: er=%b\n",
95 		    MASKREG(mtaddr->mter));
96 		mtaddr->mtid = MTID_CLR;
97 		DELAY(250);
98 		while ((mtaddr->mtid & MTID_RDY) == 0)
99 			;
100 		return (-1);
101 
102 	case MTER_RETRY:
103 		printf("mt error: er=%b\n",
104 		    MASKREG(mtaddr->mter));
105 		if (errcnt == 10) {
106 			printf("mt: unrecovered error\n");
107 			return (-1);
108 		}
109 		errcnt++;
110 		goto retry;
111 	}
112 	if (errcnt)
113 		printf("mt: recovered by retry\n");
114 	return (io->i_cc);	/* NO PARTIAL RECORD READS!!! */
115 }
116