1 /* tm.c 4.4 81/04/03 */ 2 3 /* 4 * TM11/TE?? 5 */ 6 7 #include "../h/param.h" 8 #include "../h/inode.h" 9 #include "../h/pte.h" 10 #include "../h/ubareg.h" 11 #include "saio.h" 12 #include "savax.h" 13 14 #include "../h/tmreg.h" 15 16 u_short tmstd[] = { 0172520 }; 17 18 tmopen(io) 19 register struct iob *io; 20 { 21 register skip; 22 23 tmstrategy(io, TM_REW); 24 skip = io->i_boff; 25 while (skip--) { 26 io->i_cc = 0; 27 tmstrategy(io, TM_SFORW); 28 } 29 } 30 31 tmclose(io) 32 register struct iob *io; 33 { 34 35 tmstrategy(io, TM_REW); 36 } 37 38 tmstrategy(io, func) 39 register struct iob *io; 40 { 41 register int com, unit, errcnt; 42 register struct device *tmaddr = 43 (struct device *)ubamem(io->i_unit, tmstd[0]); 44 int word, info; 45 46 unit = io->i_unit; 47 errcnt = 0; 48 retry: 49 tmquiet(tmaddr); 50 com = (unit<<8); 51 info = ubasetup(io, 1); 52 tmaddr->tmbc = -io->i_cc; 53 tmaddr->tmba = info; 54 if (func == READ) 55 tmaddr->tmcs = com | TM_RCOM | TM_GO; 56 else if (func == WRITE) 57 tmaddr->tmcs = com | TM_WCOM | TM_GO; 58 else if (func == TM_SREV) { 59 tmaddr->tmbc = -1; 60 tmaddr->tmcs = com | TM_SREV | TM_GO; 61 return (0); 62 } else 63 tmaddr->tmcs = com | func | TM_GO; 64 for (;;) { 65 word = tmaddr->tmcs; 66 if (word&TM_CUR) 67 break; 68 } 69 ubafree(io, info); 70 word = tmaddr->tmer; 71 printf("tmer %b\n", word, TMER_BITS); 72 if (word&TMER_EOT) 73 return(0); 74 if (word < 0) { 75 if (errcnt == 0) 76 printf("te error: er=%b", tmaddr->tmer, TMER_BITS); 77 if (errcnt==10) { 78 printf("\n"); 79 return(-1); 80 } 81 errcnt++; 82 tmstrategy(io, TM_SREV); 83 goto retry; 84 } 85 if (errcnt) 86 printf(" recovered by retry\n"); 87 return (io->i_cc+tmaddr->tmbc); 88 } 89 90 tmquiet(tmaddr) 91 register struct device *tmaddr; 92 { 93 register word; 94 for (;;) { 95 word = tmaddr->tmcs; 96 if (word&TM_CUR) 97 break; 98 } 99 for (;;) { 100 word = tmaddr->tmer; 101 if ((word&TMER_TUR) && (word&TMER_SDWN)==0) 102 break; 103 } 104 } 105