1 /* ht.c 6.1 83/07/29 */ 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 = 28 (struct htdevice *)mbadrv(io->i_unit); 29 int i; 30 31 for (i = 0; httypes[i]; i++) 32 if (httypes[i] == (htaddr->htdt&MBDT_TYPE)) 33 goto found; 34 _stop("not a tape\n"); 35 found: 36 mbainit(UNITTOMBA(io->i_unit)); 37 htaddr->htcs1 = HT_DCLR|HT_GO; 38 htstrategy(io, HT_REW); 39 skip = io->i_boff; 40 while (skip--) { 41 io->i_cc = -1; 42 while (htstrategy(io, HT_SFORW)) 43 ; 44 DELAY(65536); 45 htstrategy(io, HT_SENSE); 46 } 47 } 48 49 htclose(io) 50 register struct iob *io; 51 { 52 53 htstrategy(io, HT_REW); 54 } 55 56 htstrategy(io, func) 57 register struct iob *io; 58 int func; 59 { 60 register int den, errcnt, ds; 61 int er; 62 short fc; 63 register struct htdevice *htaddr = 64 (struct htdevice *)mbadrv(io->i_unit); 65 66 errcnt = 0; 67 retry: 68 den = HTTC_1600BPI|HTTC_PDP11; 69 htquiet(htaddr); 70 htaddr->htcs1 = HT_DCLR|HT_GO; 71 htaddr->httc = den; 72 htaddr->htfc = -io->i_cc; 73 if (func == HT_SREV) { 74 htaddr->htfc = -1; 75 htaddr->htcs1 = HT_SREV|HT_GO; 76 return (0); 77 } 78 if (func == READ || func == WRITE) 79 mbastart(io, func); 80 else 81 htaddr->htcs1 = func|HT_GO; 82 htquiet(htaddr); 83 ds = htaddr->htds; 84 er = htaddr->hter; 85 if (ds & HTDS_TM) { 86 htaddr->htcs1 = HT_DCLR|HT_GO; 87 return (0); 88 } 89 if (ds & HTDS_ERR) { 90 htaddr->htcs1 = HT_DCLR|HT_GO; 91 if ((er & HTER_CORCRC) == 0) { 92 printf("ht error: ds=%b, er=%b\n", 93 MASKREG(ds), HTDS_BITS, 94 MASKREG(er), HTER_BITS); 95 if (errcnt == 10) { 96 printf("ht: unrecovered error\n"); 97 return (-1); 98 } 99 errcnt++; 100 htstrategy(io, HT_SREV); 101 goto retry; 102 } 103 } 104 if (errcnt) 105 printf("ht: recovered by retry\n"); 106 fc = htaddr->htfc; 107 return (io->i_cc+fc); 108 } 109 110 htquiet(htaddr) 111 register struct htdevice *htaddr; 112 { 113 register int s; 114 115 do 116 s = htaddr->htds; 117 while ((s & HTDS_DRY) == 0); 118 } 119