1 /* tm.c 4.7 82/07/15 */ 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 "../h/fs.h" 12 #include "saio.h" 13 #include "savax.h" 14 15 #include "../h/tmreg.h" 16 17 u_short tmstd[] = { 0172520 }; 18 19 tmopen(io) 20 register struct iob *io; 21 { 22 register skip; 23 24 tmstrategy(io, TM_REW); 25 skip = io->i_boff; 26 while (skip--) { 27 io->i_cc = 0; 28 tmstrategy(io, TM_SFORW); 29 } 30 } 31 32 tmclose(io) 33 register struct iob *io; 34 { 35 36 tmstrategy(io, TM_REW); 37 } 38 39 tmstrategy(io, func) 40 register struct iob *io; 41 { 42 register int com, unit, errcnt; 43 register struct tmdevice *tmaddr = 44 (struct tmdevice *)ubamem(io->i_unit, tmstd[0]); 45 int word, info; 46 47 unit = io->i_unit; 48 errcnt = 0; 49 retry: 50 tmquiet(tmaddr); 51 com = (unit<<8); 52 info = ubasetup(io, 1); 53 tmaddr->tmbc = -io->i_cc; 54 tmaddr->tmba = info; 55 if (func == READ) 56 tmaddr->tmcs = com | TM_RCOM | TM_GO; 57 else if (func == WRITE) 58 tmaddr->tmcs = com | TM_WCOM | TM_GO; 59 else if (func == TM_SREV) { 60 tmaddr->tmbc = -1; 61 tmaddr->tmcs = com | TM_SREV | TM_GO; 62 return (0); 63 } else 64 tmaddr->tmcs = com | func | TM_GO; 65 for (;;) { 66 word = tmaddr->tmcs; 67 if (word&TM_CUR) 68 break; 69 } 70 ubafree(io, info); 71 word = tmaddr->tmer; 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 tmdevice *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