1 /* ht.c 4.4 81/03/16 */ 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 "saio.h" 13 #include "savax.h" 14 15 htopen(io) 16 register struct iob *io; 17 { 18 register int skip; 19 register struct htdevice *htaddr = (struct htdevice *)mbadrv(io->i_unit); 20 int i; 21 22 mbainit(UNITTOMBA(io->i_unit)); 23 htaddr->htcs1 = HT_DCLR|HT_GO; 24 htstrategy(io, HT_REW); 25 skip = io->i_boff; 26 while (skip--) { 27 io->i_cc = -1; 28 while (htstrategy(io, HT_SFORW)) 29 ; 30 DELAY(65536); 31 htstrategy(io, HT_SENSE); 32 } 33 } 34 35 htclose(io) 36 register struct iob *io; 37 { 38 39 htstrategy(io, HT_REW); 40 } 41 42 htstrategy(io, func) 43 register struct iob *io; 44 int func; 45 { 46 register int den, errcnt, ds; 47 short fc; 48 register struct htdevice *htaddr = 49 (struct htdevice *)mbadrv(io->i_unit); 50 51 errcnt = 0; 52 retry: 53 den = HTTC_1600BPI|HTTC_PDP11; 54 htquiet(htaddr); 55 htaddr->httc = den; 56 htaddr->htfc = -io->i_cc; 57 if (func == HT_SREV) { 58 htaddr->htfc = -1; 59 htaddr->htcs1 = HT_SREV|HT_GO; 60 return (0); 61 } 62 if (func == READ || func == WRITE) 63 mbastart(io, func); 64 else 65 htaddr->htcs1 = func|HT_GO; 66 htquiet(htaddr); 67 ds = htaddr->htds; 68 if (ds & HTDS_TM) { 69 htaddr->htcs1 = HT_DCLR|HT_GO; 70 return (0); 71 } 72 if (ds & HTDS_ERR) { 73 if (errcnt == 0) 74 printf("tape error: ds=%x, er=%x", 75 htaddr->htds, htaddr->hter); 76 htaddr->htcs1 = HT_DCLR|HT_GO; 77 if (errcnt == 10) { 78 printf("\n"); 79 return (-1); 80 } 81 errcnt++; 82 htstrategy(io, HT_SREV); 83 goto retry; 84 } 85 if (errcnt) 86 printf(" recovered by retry\n"); 87 fc = htaddr->htfc; 88 return (io->i_cc+fc); 89 } 90 91 htquiet(htaddr) 92 register struct htdevice *htaddr; 93 { 94 register int s; 95 96 do 97 s = htaddr->htds; 98 while ((s & HTDS_DRY) == 0); 99 } 100