|
|
1.1 ! root 1: /* ht.c 4.1 11/9/80 */ ! 2: ! 3: /* ! 4: * TJU16 tape driver ! 5: */ ! 6: ! 7: #include "../h/param.h" ! 8: #include "../h/inode.h" ! 9: #include "../h/pte.h" ! 10: #include "../h/mba.h" ! 11: #include "saio.h" ! 12: ! 13: struct device ! 14: { ! 15: int htcs1; ! 16: int htds; ! 17: int hter; ! 18: int htmr; ! 19: int htas; ! 20: int htfc; ! 21: int htdt; ! 22: int htck; ! 23: int htsn; ! 24: int httc; ! 25: }; ! 26: ! 27: #define HTMBA PHYSMBA1 ! 28: #define HTMBANUM 1 ! 29: ! 30: #define GO 01 ! 31: #define WCOM 060 ! 32: #define RCOM 070 ! 33: #define NOP 0 ! 34: #define WEOF 026 ! 35: #define SFORW 030 ! 36: #define SREV 032 ! 37: #define ERASE 024 ! 38: #define REW 06 ! 39: #define DCLR 010 ! 40: #define P800 01700 /* 800 + pdp11 mode */ ! 41: #define P1600 02300 /* 1600 + pdp11 mode */ ! 42: #define IENABLE 0100 ! 43: #define RDY 0200 ! 44: #define TM 04 ! 45: #define DRY 0200 ! 46: #define EOT 02000 ! 47: #define CS 02000 ! 48: #define COR 0100000 ! 49: #define PES 040 ! 50: #define WRL 04000 ! 51: #define MOL 010000 ! 52: #define ERR 040000 ! 53: #define FCE 01000 ! 54: #define TRE 040000 ! 55: #define HARD 064023 /* UNS|OPI|NEF|FMT|RMR|ILR|ILF */ ! 56: ! 57: #define SIO 1 ! 58: #define SSFOR 2 ! 59: #define SSREV 3 ! 60: #define SRETRY 4 ! 61: #define SCOM 5 ! 62: #define SOK 6 ! 63: ! 64: htopen(io) ! 65: register struct iob *io; ! 66: { ! 67: register skip; ! 68: int i; ! 69: ! 70: if ((mbaact&(1<<HTMBANUM)) == 0) ! 71: mbainit(HTMBANUM); ! 72: htinit(); ! 73: htstrategy(io, REW); ! 74: skip = io->i_boff; ! 75: while (skip--) { ! 76: io->i_cc = -1; ! 77: while (htstrategy(io, SFORW)) ! 78: ; ! 79: i = 65536; ! 80: while (--i) ! 81: ; ! 82: htstrategy(io, NOP); ! 83: } ! 84: } ! 85: ! 86: htclose(io) ! 87: register struct iob *io; ! 88: { ! 89: htstrategy(io, REW); ! 90: } ! 91: ! 92: htstrategy(io, func) ! 93: register struct iob *io; ! 94: { ! 95: register int unit, den, errcnt, ds; ! 96: short fc; ! 97: register struct device *htp = mbadev(HTMBA,0); ! 98: ! 99: unit = io->i_unit; ! 100: errcnt = 0; ! 101: retry: ! 102: if(unit & 1) ! 103: den = P1600; ! 104: else ! 105: den = P800; ! 106: htquiet(); ! 107: if((htp->httc&03777) != den) ! 108: htp->httc = den; ! 109: htp->htfc = -io->i_cc; ! 110: if (func == SREV) { ! 111: htp->htfc = -1; ! 112: htp->htcs1 = SREV | GO; ! 113: return(0); ! 114: } ! 115: if (func == READ || func == WRITE) ! 116: mbastart(io, htp, func); ! 117: else ! 118: htp->htcs1 = func | GO; ! 119: htquiet(); ! 120: ds = htp->htds & TM; ! 121: if (ds&TM) { ! 122: htinit(); ! 123: return(0); ! 124: } ! 125: if (ds&ERR) { ! 126: if (errcnt == 0) ! 127: printf("tape error: ds=%x, er=%x, mbasr=%x", ! 128: htp->htds, htp->hter, ! 129: HTMBA->mba_sr); ! 130: htinit(); ! 131: if (errcnt == 10) { ! 132: printf("\n"); ! 133: return(-1); ! 134: } ! 135: errcnt++; ! 136: htstrategy(io, SREV); ! 137: goto retry; ! 138: } ! 139: if (errcnt) ! 140: printf(" recovered by retry\n"); ! 141: fc = htp->htfc; ! 142: return(io->i_cc+fc); ! 143: } ! 144: ! 145: htinit() ! 146: { ! 147: ! 148: mbadev(HTMBA,0)->htcs1 = DCLR|GO; ! 149: } ! 150: ! 151: htquiet() ! 152: { ! 153: register int s; ! 154: register struct device *htp = mbadev(HTMBA,0); ! 155: ! 156: do ! 157: s = htp->htds; ! 158: while ((s & RDY) == 0); ! 159: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.