xref: /csrg-svn/sys/vax/stand/tm.c (revision 9806)
1*9806Ssam /*	tm.c	4.9	82/12/17	*/
23263Swnj 
31811Sbill /*
43263Swnj  * TM11/TE??
51811Sbill  */
6*9806Ssam #include "../machine/pte.h"
71811Sbill 
81811Sbill #include "../h/param.h"
91811Sbill #include "../h/inode.h"
107447Sroot #include "../h/fs.h"
119186Ssam 
129186Ssam #include "../vaxuba/ubareg.h"
139186Ssam #include "../vaxuba/tmreg.h"
149186Ssam 
151811Sbill #include "saio.h"
163263Swnj #include "savax.h"
171811Sbill 
181811Sbill 
193263Swnj u_short	tmstd[] = { 0172520 };
201811Sbill 
211811Sbill tmopen(io)
221924Swnj 	register struct iob *io;
231811Sbill {
241811Sbill 	register skip;
251811Sbill 
263263Swnj 	tmstrategy(io, TM_REW);
271811Sbill 	skip = io->i_boff;
281811Sbill 	while (skip--) {
291811Sbill 		io->i_cc = 0;
303477Sroot 		tmstrategy(io, TM_SFORW);
311811Sbill 	}
321811Sbill }
331811Sbill 
341811Sbill tmclose(io)
351924Swnj 	register struct iob *io;
361811Sbill {
371924Swnj 
383263Swnj 	tmstrategy(io, TM_REW);
391811Sbill }
401811Sbill 
411811Sbill tmstrategy(io, func)
421924Swnj 	register struct iob *io;
431811Sbill {
441811Sbill 	register int com, unit, errcnt;
455157Sroot 	register struct tmdevice *tmaddr =
465157Sroot 	    (struct tmdevice *)ubamem(io->i_unit, tmstd[0]);
473263Swnj 	int word, info;
481811Sbill 
491811Sbill 	unit = io->i_unit;
501811Sbill 	errcnt = 0;
511811Sbill retry:
523263Swnj 	tmquiet(tmaddr);
533263Swnj 	com = (unit<<8);
541811Sbill 	info = ubasetup(io, 1);
553263Swnj 	tmaddr->tmbc = -io->i_cc;
563263Swnj 	tmaddr->tmba = info;
571811Sbill 	if (func == READ)
583263Swnj 		tmaddr->tmcs = com | TM_RCOM | TM_GO;
591811Sbill 	else if (func == WRITE)
603263Swnj 		tmaddr->tmcs = com | TM_WCOM | TM_GO;
613263Swnj 	else if (func == TM_SREV) {
623263Swnj 		tmaddr->tmbc = -1;
633263Swnj 		tmaddr->tmcs = com | TM_SREV | TM_GO;
641924Swnj 		return (0);
651811Sbill 	} else
663263Swnj 		tmaddr->tmcs = com | func | TM_GO;
671924Swnj 	for (;;) {
683263Swnj 		word = tmaddr->tmcs;
693263Swnj 		if (word&TM_CUR)
701924Swnj 			break;
711924Swnj 	}
723263Swnj 	ubafree(io, info);
733263Swnj 	word = tmaddr->tmer;
743263Swnj 	if (word&TMER_EOT)
751811Sbill 		return(0);
761924Swnj 	if (word < 0) {
771811Sbill 		if (errcnt == 0)
783477Sroot 			printf("te error: er=%b", tmaddr->tmer, TMER_BITS);
791811Sbill 		if (errcnt==10) {
801811Sbill 			printf("\n");
811811Sbill 			return(-1);
821811Sbill 		}
831811Sbill 		errcnt++;
843263Swnj 		tmstrategy(io, TM_SREV);
851811Sbill 		goto retry;
861811Sbill 	}
871811Sbill 	if (errcnt)
881811Sbill 		printf(" recovered by retry\n");
893263Swnj 	return (io->i_cc+tmaddr->tmbc);
901811Sbill }
911811Sbill 
923263Swnj tmquiet(tmaddr)
935157Sroot 	register struct tmdevice *tmaddr;
941811Sbill {
951924Swnj 	register word;
961924Swnj 	for (;;) {
973263Swnj 		word = tmaddr->tmcs;
983263Swnj 		if (word&TM_CUR)
991924Swnj 			break;
1001924Swnj 	}
1011924Swnj 	for (;;) {
1023263Swnj 		word = tmaddr->tmer;
1033263Swnj 		if ((word&TMER_TUR) && (word&TMER_SDWN)==0)
1041924Swnj 			break;
1051924Swnj 	}
1061811Sbill }
107