xref: /csrg-svn/sys/vax/stand/tm.c (revision 7447)
1*7447Sroot /*	tm.c	4.7	82/07/15	*/
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"
11*7447Sroot #include "../h/fs.h"
121811Sbill #include "saio.h"
133263Swnj #include "savax.h"
141811Sbill 
153263Swnj #include "../h/tmreg.h"
161811Sbill 
173263Swnj u_short	tmstd[] = { 0172520 };
181811Sbill 
191811Sbill tmopen(io)
201924Swnj 	register struct iob *io;
211811Sbill {
221811Sbill 	register skip;
231811Sbill 
243263Swnj 	tmstrategy(io, TM_REW);
251811Sbill 	skip = io->i_boff;
261811Sbill 	while (skip--) {
271811Sbill 		io->i_cc = 0;
283477Sroot 		tmstrategy(io, TM_SFORW);
291811Sbill 	}
301811Sbill }
311811Sbill 
321811Sbill tmclose(io)
331924Swnj 	register struct iob *io;
341811Sbill {
351924Swnj 
363263Swnj 	tmstrategy(io, TM_REW);
371811Sbill }
381811Sbill 
391811Sbill tmstrategy(io, func)
401924Swnj 	register struct iob *io;
411811Sbill {
421811Sbill 	register int com, unit, errcnt;
435157Sroot 	register struct tmdevice *tmaddr =
445157Sroot 	    (struct tmdevice *)ubamem(io->i_unit, tmstd[0]);
453263Swnj 	int word, info;
461811Sbill 
471811Sbill 	unit = io->i_unit;
481811Sbill 	errcnt = 0;
491811Sbill retry:
503263Swnj 	tmquiet(tmaddr);
513263Swnj 	com = (unit<<8);
521811Sbill 	info = ubasetup(io, 1);
533263Swnj 	tmaddr->tmbc = -io->i_cc;
543263Swnj 	tmaddr->tmba = info;
551811Sbill 	if (func == READ)
563263Swnj 		tmaddr->tmcs = com | TM_RCOM | TM_GO;
571811Sbill 	else if (func == WRITE)
583263Swnj 		tmaddr->tmcs = com | TM_WCOM | TM_GO;
593263Swnj 	else if (func == TM_SREV) {
603263Swnj 		tmaddr->tmbc = -1;
613263Swnj 		tmaddr->tmcs = com | TM_SREV | TM_GO;
621924Swnj 		return (0);
631811Sbill 	} else
643263Swnj 		tmaddr->tmcs = com | func | TM_GO;
651924Swnj 	for (;;) {
663263Swnj 		word = tmaddr->tmcs;
673263Swnj 		if (word&TM_CUR)
681924Swnj 			break;
691924Swnj 	}
703263Swnj 	ubafree(io, info);
713263Swnj 	word = tmaddr->tmer;
723263Swnj 	if (word&TMER_EOT)
731811Sbill 		return(0);
741924Swnj 	if (word < 0) {
751811Sbill 		if (errcnt == 0)
763477Sroot 			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)
915157Sroot 	register struct tmdevice *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