xref: /csrg-svn/sys/vax/stand/tm.c (revision 13568)
1*13568Ssam /*	tm.c	4.11	83/07/01	*/
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*13568Ssam 		DELAY(100);
7011383Ssam 		if (word & TM_CUR)
711924Swnj 			break;
721924Swnj 	}
733263Swnj 	ubafree(io, info);
743263Swnj 	word = tmaddr->tmer;
7511383Ssam 	if (word & TMER_EOT)
7611383Ssam 		return (0);
7711383Ssam 	if (word & TM_ERR) {
7811383Ssam 		if (word & TMER_EOF)
7911383Ssam 			return (0);
801811Sbill 		if (errcnt == 0)
8111383Ssam 			printf("te error: er=%b", word, TMER_BITS);
8211383Ssam 		if (errcnt == 10) {
831811Sbill 			printf("\n");
8411383Ssam 			return (-1);
851811Sbill 		}
861811Sbill 		errcnt++;
873263Swnj 		tmstrategy(io, TM_SREV);
881811Sbill 		goto retry;
891811Sbill 	}
901811Sbill 	if (errcnt)
911811Sbill 		printf(" recovered by retry\n");
9211383Ssam 	if (word & TMER_EOF)
9311383Ssam 		return (0);
9411383Ssam 	return (io->i_cc + tmaddr->tmbc);
951811Sbill }
961811Sbill 
973263Swnj tmquiet(tmaddr)
985157Sroot 	register struct tmdevice *tmaddr;
991811Sbill {
1001924Swnj 	register word;
1011924Swnj 	for (;;) {
1023263Swnj 		word = tmaddr->tmcs;
103*13568Ssam 		DELAY(100);
1043263Swnj 		if (word&TM_CUR)
1051924Swnj 			break;
1061924Swnj 	}
1071924Swnj 	for (;;) {
1083263Swnj 		word = tmaddr->tmer;
109*13568Ssam 		DELAY(100);
1103263Swnj 		if ((word&TMER_TUR) && (word&TMER_SDWN)==0)
1111924Swnj 			break;
1121924Swnj 	}
1131811Sbill }
114