Annotation of 41BSD/4.0.upgrade/sys/stand/mt.c, revision 1.1.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.