Annotation of 43BSD/sys/stand/tm.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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