xref: /csrg-svn/sys/vax/stand/tm.c (revision 5157)
1*5157Sroot /*	tm.c	4.6	81/12/01	*/
23263Swnj 
31811Sbill /*
43263Swnj  * TM11/TE??
51811Sbill  */
61811Sbill 
71811Sbill #include "../h/param.h"
81811Sbill #include "../h/inode.h"
91811Sbill #include "../h/pte.h"
103263Swnj #include "../h/ubareg.h"
111811Sbill #include "saio.h"
123263Swnj #include "savax.h"
131811Sbill 
143263Swnj #include "../h/tmreg.h"
151811Sbill 
163263Swnj u_short	tmstd[] = { 0172520 };
171811Sbill 
181811Sbill tmopen(io)
191924Swnj 	register struct iob *io;
201811Sbill {
211811Sbill 	register skip;
221811Sbill 
233263Swnj 	tmstrategy(io, TM_REW);
241811Sbill 	skip = io->i_boff;
251811Sbill 	while (skip--) {
261811Sbill 		io->i_cc = 0;
273477Sroot 		tmstrategy(io, TM_SFORW);
281811Sbill 	}
291811Sbill }
301811Sbill 
311811Sbill tmclose(io)
321924Swnj 	register struct iob *io;
331811Sbill {
341924Swnj 
353263Swnj 	tmstrategy(io, TM_REW);
361811Sbill }
371811Sbill 
381811Sbill tmstrategy(io, func)
391924Swnj 	register struct iob *io;
401811Sbill {
411811Sbill 	register int com, unit, errcnt;
42*5157Sroot 	register struct tmdevice *tmaddr =
43*5157Sroot 	    (struct tmdevice *)ubamem(io->i_unit, tmstd[0]);
443263Swnj 	int word, info;
451811Sbill 
461811Sbill 	unit = io->i_unit;
471811Sbill 	errcnt = 0;
481811Sbill retry:
493263Swnj 	tmquiet(tmaddr);
503263Swnj 	com = (unit<<8);
511811Sbill 	info = ubasetup(io, 1);
523263Swnj 	tmaddr->tmbc = -io->i_cc;
533263Swnj 	tmaddr->tmba = info;
541811Sbill 	if (func == READ)
553263Swnj 		tmaddr->tmcs = com | TM_RCOM | TM_GO;
561811Sbill 	else if (func == WRITE)
573263Swnj 		tmaddr->tmcs = com | TM_WCOM | TM_GO;
583263Swnj 	else if (func == TM_SREV) {
593263Swnj 		tmaddr->tmbc = -1;
603263Swnj 		tmaddr->tmcs = com | TM_SREV | TM_GO;
611924Swnj 		return (0);
621811Sbill 	} else
633263Swnj 		tmaddr->tmcs = com | func | TM_GO;
641924Swnj 	for (;;) {
653263Swnj 		word = tmaddr->tmcs;
663263Swnj 		if (word&TM_CUR)
671924Swnj 			break;
681924Swnj 	}
693263Swnj 	ubafree(io, info);
703263Swnj 	word = tmaddr->tmer;
713263Swnj 	if (word&TMER_EOT)
721811Sbill 		return(0);
731924Swnj 	if (word < 0) {
741811Sbill 		if (errcnt == 0)
753477Sroot 			printf("te error: er=%b", tmaddr->tmer, TMER_BITS);
761811Sbill 		if (errcnt==10) {
771811Sbill 			printf("\n");
781811Sbill 			return(-1);
791811Sbill 		}
801811Sbill 		errcnt++;
813263Swnj 		tmstrategy(io, TM_SREV);
821811Sbill 		goto retry;
831811Sbill 	}
841811Sbill 	if (errcnt)
851811Sbill 		printf(" recovered by retry\n");
863263Swnj 	return (io->i_cc+tmaddr->tmbc);
871811Sbill }
881811Sbill 
893263Swnj tmquiet(tmaddr)
90*5157Sroot 	register struct tmdevice *tmaddr;
911811Sbill {
921924Swnj 	register word;
931924Swnj 	for (;;) {
943263Swnj 		word = tmaddr->tmcs;
953263Swnj 		if (word&TM_CUR)
961924Swnj 			break;
971924Swnj 	}
981924Swnj 	for (;;) {
993263Swnj 		word = tmaddr->tmer;
1003263Swnj 		if ((word&TMER_TUR) && (word&TMER_SDWN)==0)
1011924Swnj 			break;
1021924Swnj 	}
1031811Sbill }
104