xref: /csrg-svn/sys/vax/stand/tm.c (revision 3263)
1*3263Swnj /*	tm.c	4.3	81/03/15	*/
2*3263Swnj 
31811Sbill /*
4*3263Swnj  * TM11/TE??
51811Sbill  */
61811Sbill 
71811Sbill #include "../h/param.h"
81811Sbill #include "../h/inode.h"
91811Sbill #include "../h/pte.h"
10*3263Swnj #include "../h/ubareg.h"
111811Sbill #include "saio.h"
12*3263Swnj #include "savax.h"
131811Sbill 
14*3263Swnj #include "../h/tmreg.h"
151811Sbill 
16*3263Swnj u_short	tmstd[] = { 0172520 };
171811Sbill 
181811Sbill tmopen(io)
191924Swnj 	register struct iob *io;
201811Sbill {
211811Sbill 	register skip;
221811Sbill 
23*3263Swnj 	tmstrategy(io, TM_REW);
241811Sbill 	skip = io->i_boff;
251811Sbill 	while (skip--) {
261811Sbill 		io->i_cc = 0;
27*3263Swnj 		while (tmstrategy(io, TM_SFORW))
281811Sbill 			;
291811Sbill 	}
301811Sbill }
311811Sbill 
321811Sbill tmclose(io)
331924Swnj 	register struct iob *io;
341811Sbill {
351924Swnj 
36*3263Swnj 	tmstrategy(io, TM_REW);
371811Sbill }
381811Sbill 
391811Sbill tmstrategy(io, func)
401924Swnj 	register struct iob *io;
411811Sbill {
421811Sbill 	register int com, unit, errcnt;
43*3263Swnj 	register struct device *tmaddr =
44*3263Swnj 	    (struct device *)ubamem(io->i_unit, tmstd[0]);
45*3263Swnj 	int word, info;
461811Sbill 
471811Sbill 	unit = io->i_unit;
481811Sbill 	errcnt = 0;
491811Sbill retry:
50*3263Swnj 	tmquiet(tmaddr);
51*3263Swnj 	com = (unit<<8);
521811Sbill 	info = ubasetup(io, 1);
53*3263Swnj 	tmaddr->tmbc = -io->i_cc;
54*3263Swnj 	tmaddr->tmba = info;
551811Sbill 	if (func == READ)
56*3263Swnj 		tmaddr->tmcs = com | TM_RCOM | TM_GO;
571811Sbill 	else if (func == WRITE)
58*3263Swnj 		tmaddr->tmcs = com | TM_WCOM | TM_GO;
59*3263Swnj 	else if (func == TM_SREV) {
60*3263Swnj 		tmaddr->tmbc = -1;
61*3263Swnj 		tmaddr->tmcs = com | TM_SREV | TM_GO;
621924Swnj 		return (0);
631811Sbill 	} else
64*3263Swnj 		tmaddr->tmcs = com | func | TM_GO;
651924Swnj 	for (;;) {
66*3263Swnj 		word = tmaddr->tmcs;
67*3263Swnj 		if (word&TM_CUR)
681924Swnj 			break;
691924Swnj 	}
701811Sbill 		;
71*3263Swnj 	ubafree(io, info);
72*3263Swnj 	word = tmaddr->tmer;
73*3263Swnj 	if (word&TMER_EOT)
741811Sbill 		return(0);
751924Swnj 	if (word < 0) {
761811Sbill 		if (errcnt == 0)
77*3263Swnj 			printf("te error: er=%o", tmaddr->tmer);
781811Sbill 		if (errcnt==10) {
791811Sbill 			printf("\n");
801811Sbill 			return(-1);
811811Sbill 		}
821811Sbill 		errcnt++;
83*3263Swnj 		tmstrategy(io, TM_SREV);
841811Sbill 		goto retry;
851811Sbill 	}
861811Sbill 	if (errcnt)
871811Sbill 		printf(" recovered by retry\n");
88*3263Swnj 	return (io->i_cc+tmaddr->tmbc);
891811Sbill }
901811Sbill 
91*3263Swnj tmquiet(tmaddr)
92*3263Swnj 	register struct device *tmaddr;
931811Sbill {
941924Swnj 	register word;
951924Swnj 	for (;;) {
96*3263Swnj 		word = tmaddr->tmcs;
97*3263Swnj 		if (word&TM_CUR)
981924Swnj 			break;
991924Swnj 	}
1001924Swnj 	for (;;) {
101*3263Swnj 		word = tmaddr->tmer;
102*3263Swnj 		if ((word&TMER_TUR) && (word&TMER_SDWN)==0)
1031924Swnj 			break;
1041924Swnj 	}
1051811Sbill }
106