Annotation of 41BSD/4.0.upgrade/sys/stand/mt.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.