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