|
|
1.1 ! root 1: /* mt.c 4.1 81/12/01 */ ! 2: ! 3: /* ! 4: * TM78/TU78 tape driver ! 5: */ ! 6: ! 7: #include "../h/mtreg.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: short mttypes[] = ! 16: { MBDT_TU78, 0 }; ! 17: ! 18: #define MASKREG(reg) ((reg)&0xffff) ! 19: ! 20: mtopen(io) ! 21: register struct iob *io; ! 22: { ! 23: register int skip; ! 24: register struct mtdevice *mtaddr = (struct mtdevice *)mbadrv(io->i_unit); ! 25: int i; ! 26: ! 27: for (i = 0; mttypes[i]; i++) ! 28: if (mttypes[i] == (mtaddr->mtdt&MBDT_TYPE)) ! 29: goto found; ! 30: _stop("not a tape\n"); ! 31: found: ! 32: mbainit(UNITTOMBA(io->i_unit)); ! 33: mtaddr->mtid = MTID_CLR; ! 34: DELAY(250); ! 35: while ((mtaddr->mtid & MTID_RDY) == 0) ! 36: ; ! 37: mtstrategy(io, MT_REW); ! 38: skip = io->i_boff; ! 39: while (skip--) { ! 40: io->i_cc = -1; ! 41: mtstrategy(io, MT_SFORWF); ! 42: } ! 43: } ! 44: ! 45: mtclose(io) ! 46: register struct iob *io; ! 47: { ! 48: ! 49: mtstrategy(io, MT_REW); ! 50: } ! 51: ! 52: mtstrategy(io, func) ! 53: register struct iob *io; ! 54: int func; ! 55: { ! 56: register int errcnt, s, ic; ! 57: register struct mtdevice *mtaddr = ! 58: (struct mtdevice *)mbadrv(io->i_unit); ! 59: ! 60: errcnt = 0; ! 61: retry: ! 62: if (func == READ || func == WRITE) { ! 63: mtaddr->mtca = 1<<2; /* 1 record */ ! 64: mtaddr->mtbc = io->i_cc; ! 65: mtaddr->mter = 0; ! 66: mbastart(io, func); ! 67: do ! 68: s = mtaddr->mter & MTER_INTCODE; ! 69: while (s == 0); ! 70: ic = s; ! 71: DELAY(2000); ! 72: } else { ! 73: mtaddr->mtas = -1; ! 74: mtaddr->mtncs[0] = (-io->i_cc << 8)|func|MT_GO; ! 75: rwait: ! 76: do ! 77: s = mtaddr->mtas&0xffff; ! 78: while (s == 0); ! 79: mtaddr->mtas = mtaddr->mtas; /* clear attention */ ! 80: ic = mtaddr->mtner & MTER_INTCODE; ! 81: } ! 82: switch (ic) { ! 83: case MTER_TM: ! 84: case MTER_EOT: ! 85: case MTER_LEOT: ! 86: return (0); ! 87: ! 88: case MTER_DONE: ! 89: break; ! 90: ! 91: case MTER_RWDING: ! 92: goto rwait; ! 93: default: ! 94: printf("mt hard error: er=%b\n", ! 95: MASKREG(mtaddr->mter)); ! 96: mtaddr->mtid = MTID_CLR; ! 97: DELAY(250); ! 98: while ((mtaddr->mtid & MTID_RDY) == 0) ! 99: ; ! 100: return (-1); ! 101: ! 102: case MTER_RETRY: ! 103: printf("mt error: er=%b\n", ! 104: MASKREG(mtaddr->mter)); ! 105: if (errcnt == 10) { ! 106: printf("mt: unrecovered error\n"); ! 107: return (-1); ! 108: } ! 109: errcnt++; ! 110: goto retry; ! 111: } ! 112: if (errcnt) ! 113: printf("mt: recovered by retry\n"); ! 114: return (io->i_cc); /* NO PARTIAL RECORD READS!!! */ ! 115: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.