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