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