|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986, 1988 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: * @(#)tm.c 7.5 (Berkeley) 7/9/88 ! 7: */ ! 8: ! 9: /* ! 10: * TM11/TE?? ! 11: */ ! 12: ! 13: #include "param.h" ! 14: #include "inode.h" ! 15: #include "fs.h" ! 16: ! 17: #include "../vax/pte.h" ! 18: ! 19: #include "../vaxuba/ubareg.h" ! 20: #include "../vaxuba/tmreg.h" ! 21: ! 22: #include "saio.h" ! 23: #include "savax.h" ! 24: ! 25: #define MAXCTLR 1 /* all addresses must be specified */ ! 26: u_short tmstd[MAXCTLR] = { 0172520 }; ! 27: ! 28: tmopen(io) ! 29: register struct iob *io; ! 30: { ! 31: register int skip; ! 32: ! 33: if ((u_int)io->i_adapt >= nuba) ! 34: return (EADAPT); ! 35: if ((u_int)io->i_ctlr >= MAXCTLR) ! 36: return (ECTLR); ! 37: if (badaddr((char *)ubamem(io->i_adapt, tmstd[io->i_ctlr]), sizeof(short))) ! 38: return (ENXIO); ! 39: tmstrategy(io, TM_REW); ! 40: for (skip = io->i_part; skip--;) { ! 41: io->i_cc = 0; ! 42: tmstrategy(io, TM_SFORW); ! 43: } ! 44: return (0); ! 45: } ! 46: ! 47: tmclose(io) ! 48: register struct iob *io; ! 49: { ! 50: tmstrategy(io, TM_REW); ! 51: } ! 52: ! 53: tmstrategy(io, func) ! 54: register struct iob *io; ! 55: { ! 56: register int com, errcnt; ! 57: register struct tmdevice *tmaddr; ! 58: int word, info; ! 59: ! 60: tmaddr = (struct tmdevice *)ubamem(io->i_adapt, tmstd[io->i_ctlr]); ! 61: errcnt = 0; ! 62: retry: ! 63: tmquiet(tmaddr); ! 64: info = ubasetup(io, 1); ! 65: tmaddr->tmbc = -io->i_cc; ! 66: tmaddr->tmba = info; ! 67: com = (io->i_unit<<8) | TM_GO; ! 68: if (func == READ) ! 69: tmaddr->tmcs = com | TM_RCOM; ! 70: else if (func == WRITE) ! 71: tmaddr->tmcs = com | TM_WCOM; ! 72: else if (func == TM_SREV) { ! 73: tmaddr->tmbc = -1; ! 74: tmaddr->tmcs = com | TM_SREV; ! 75: return (0); ! 76: } else ! 77: tmaddr->tmcs = com | func; ! 78: for (;;) { ! 79: word = tmaddr->tmcs; ! 80: DELAY(100); ! 81: if (word & TM_CUR) ! 82: break; ! 83: } ! 84: ubafree(io, info); ! 85: word = tmaddr->tmer; ! 86: if (word & TMER_EOT) ! 87: return (0); ! 88: if (word & TM_ERR) { ! 89: if (word & TMER_EOF) ! 90: return (0); ! 91: printf("tm tape error: er=%b\n", word, TMER_BITS); ! 92: if (errcnt++ == 10) { ! 93: printf("tm: unrecovered error\n"); ! 94: return (-1); ! 95: } ! 96: tmstrategy(io, TM_SREV); ! 97: goto retry; ! 98: } ! 99: if (errcnt) ! 100: printf("tm: recovered by retry\n"); ! 101: if (word & TMER_EOF) ! 102: return (0); ! 103: return (io->i_cc + tmaddr->tmbc); ! 104: } ! 105: ! 106: tmquiet(tmaddr) ! 107: register struct tmdevice *tmaddr; ! 108: { ! 109: register word; ! 110: for (;;) { ! 111: word = tmaddr->tmcs; ! 112: DELAY(100); ! 113: if (word&TM_CUR) ! 114: break; ! 115: } ! 116: for (;;) { ! 117: word = tmaddr->tmer; ! 118: DELAY(100); ! 119: if ((word&TMER_TUR) && (word&TMER_SDWN)==0) ! 120: break; ! 121: } ! 122: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.