1 /* ht.c 4.7 82/03/07 */ 2 3 /* 4 * TM03/TU?? tape driver 5 */ 6 7 #include "../h/htreg.h" 8 #include "../h/param.h" 9 #include "../h/inode.h" 10 #include "../h/pte.h" 11 #include "../h/mbareg.h" 12 #include "../h/fs.h" 13 #include "saio.h" 14 #include "savax.h" 15 16 short httypes[] = 17 { MBDT_TM03, MBDT_TE16, MBDT_TU45, MBDT_TU77, 0 }; 18 19 #define MASKREG(reg) ((reg)&0xffff) 20 21 htopen(io) 22 register struct iob *io; 23 { 24 register int skip; 25 register struct htdevice *htaddr = (struct htdevice *)mbadrv(io->i_unit); 26 int i; 27 28 for (i = 0; httypes[i]; i++) 29 if (httypes[i] == (htaddr->htdt&MBDT_TYPE)) 30 goto found; 31 _stop("not a tape\n"); 32 found: 33 mbainit(UNITTOMBA(io->i_unit)); 34 htaddr->htcs1 = HT_DCLR|HT_GO; 35 htstrategy(io, HT_REW); 36 skip = io->i_boff; 37 while (skip--) { 38 io->i_cc = -1; 39 while (htstrategy(io, HT_SFORW)) 40 ; 41 DELAY(65536); 42 htstrategy(io, HT_SENSE); 43 } 44 } 45 46 htclose(io) 47 register struct iob *io; 48 { 49 50 htstrategy(io, HT_REW); 51 } 52 53 htstrategy(io, func) 54 register struct iob *io; 55 int func; 56 { 57 register int den, errcnt, ds; 58 int er; 59 short fc; 60 register struct htdevice *htaddr = 61 (struct htdevice *)mbadrv(io->i_unit); 62 63 errcnt = 0; 64 retry: 65 den = HTTC_1600BPI|HTTC_PDP11; 66 htquiet(htaddr); 67 htaddr->htcs1 = HT_DCLR|HT_GO; 68 htaddr->httc = den; 69 htaddr->htfc = -io->i_cc; 70 if (func == HT_SREV) { 71 htaddr->htfc = -1; 72 htaddr->htcs1 = HT_SREV|HT_GO; 73 return (0); 74 } 75 if (func == READ || func == WRITE) 76 mbastart(io, func); 77 else 78 htaddr->htcs1 = func|HT_GO; 79 htquiet(htaddr); 80 ds = htaddr->htds; 81 er = htaddr->hter; 82 if (ds & HTDS_TM) { 83 htaddr->htcs1 = HT_DCLR|HT_GO; 84 return (0); 85 } 86 if (ds & HTDS_ERR) { 87 htaddr->htcs1 = HT_DCLR|HT_GO; 88 if ((er & HTER_CORCRC) == 0) { 89 printf("ht error: ds=%b, er=%b\n", 90 MASKREG(ds), HTDS_BITS, 91 MASKREG(er), HTER_BITS); 92 if (errcnt == 10) { 93 printf("ht: unrecovered error\n"); 94 return (-1); 95 } 96 errcnt++; 97 htstrategy(io, HT_SREV); 98 goto retry; 99 } 100 } 101 if (errcnt) 102 printf("ht: recovered by retry\n"); 103 fc = htaddr->htfc; 104 return (io->i_cc+fc); 105 } 106 107 htquiet(htaddr) 108 register struct htdevice *htaddr; 109 { 110 register int s; 111 112 do 113 s = htaddr->htds; 114 while ((s & HTDS_DRY) == 0); 115 } 116 117 118