xref: /csrg-svn/sys/vax/stand/tm.c (revision 3477)
1*3477Sroot /*	tm.c	4.4	81/04/03	*/
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;
27*3477Sroot 		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;
423263Swnj 	register struct device *tmaddr =
433263Swnj 	    (struct device *)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;
71*3477Sroot 	printf("tmer %b\n", word, TMER_BITS);
723263Swnj 	if (word&TMER_EOT)
731811Sbill 		return(0);
741924Swnj 	if (word < 0) {
751811Sbill 		if (errcnt == 0)
76*3477Sroot 			printf("te error: er=%b", tmaddr->tmer, TMER_BITS);
771811Sbill 		if (errcnt==10) {
781811Sbill 			printf("\n");
791811Sbill 			return(-1);
801811Sbill 		}
811811Sbill 		errcnt++;
823263Swnj 		tmstrategy(io, TM_SREV);
831811Sbill 		goto retry;
841811Sbill 	}
851811Sbill 	if (errcnt)
861811Sbill 		printf(" recovered by retry\n");
873263Swnj 	return (io->i_cc+tmaddr->tmbc);
881811Sbill }
891811Sbill 
903263Swnj tmquiet(tmaddr)
913263Swnj 	register struct device *tmaddr;
921811Sbill {
931924Swnj 	register word;
941924Swnj 	for (;;) {
953263Swnj 		word = tmaddr->tmcs;
963263Swnj 		if (word&TM_CUR)
971924Swnj 			break;
981924Swnj 	}
991924Swnj 	for (;;) {
1003263Swnj 		word = tmaddr->tmer;
1013263Swnj 		if ((word&TMER_TUR) && (word&TMER_SDWN)==0)
1021924Swnj 			break;
1031924Swnj 	}
1041811Sbill }
105