xref: /csrg-svn/sys/vax/stand/tm.c (revision 11383)
1*11383Ssam /*	tm.c	4.10	83/03/02	*/
23263Swnj 
31811Sbill /*
43263Swnj  * TM11/TE??
51811Sbill  */
69806Ssam #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;
69*11383Ssam 		if (word & TM_CUR)
701924Swnj 			break;
711924Swnj 	}
723263Swnj 	ubafree(io, info);
733263Swnj 	word = tmaddr->tmer;
74*11383Ssam 	if (word & TMER_EOT)
75*11383Ssam 		return (0);
76*11383Ssam 	if (word & TM_ERR) {
77*11383Ssam 		if (word & TMER_EOF)
78*11383Ssam 			return (0);
791811Sbill 		if (errcnt == 0)
80*11383Ssam 			printf("te error: er=%b", word, TMER_BITS);
81*11383Ssam 		if (errcnt == 10) {
821811Sbill 			printf("\n");
83*11383Ssam 			return (-1);
841811Sbill 		}
851811Sbill 		errcnt++;
863263Swnj 		tmstrategy(io, TM_SREV);
871811Sbill 		goto retry;
881811Sbill 	}
891811Sbill 	if (errcnt)
901811Sbill 		printf(" recovered by retry\n");
91*11383Ssam 	if (word & TMER_EOF)
92*11383Ssam 		return (0);
93*11383Ssam 	return (io->i_cc + tmaddr->tmbc);
941811Sbill }
951811Sbill 
963263Swnj tmquiet(tmaddr)
975157Sroot 	register struct tmdevice *tmaddr;
981811Sbill {
991924Swnj 	register word;
1001924Swnj 	for (;;) {
1013263Swnj 		word = tmaddr->tmcs;
1023263Swnj 		if (word&TM_CUR)
1031924Swnj 			break;
1041924Swnj 	}
1051924Swnj 	for (;;) {
1063263Swnj 		word = tmaddr->tmer;
1073263Swnj 		if ((word&TMER_TUR) && (word&TMER_SDWN)==0)
1081924Swnj 			break;
1091924Swnj 	}
1101811Sbill }
111