Annotation of 43BSDTahoe/sys/vaxstand/ut.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1982, 1986, 1988 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:  *     @(#)ut.c        7.5 (Berkeley) 7/9/88
        !             7:  */
        !             8: 
        !             9: /*
        !            10:  * SI Model 9700 -- emulates TU45 on the UNIBUS
        !            11:  */
        !            12: 
        !            13: #include "param.h"
        !            14: #include "inode.h"
        !            15: #include "fs.h"
        !            16: 
        !            17: #include "../vax/pte.h"
        !            18: 
        !            19: #include "../vaxuba/ubareg.h"
        !            20: #include "../vaxuba/utreg.h"
        !            21: 
        !            22: #include "saio.h"
        !            23: #include "savax.h"
        !            24: 
        !            25: #define        MASKREG(reg)    ((reg)&0xffff)
        !            26: 
        !            27: #define        MAXCTLR         1               /* all addresses must be specified */
        !            28: u_short        utstd[MAXCTLR] = { 0172440 };   /* non-standard */
        !            29: 
        !            30: utopen(io)
        !            31:        register struct iob *io;
        !            32: {
        !            33:        register int skip;
        !            34: 
        !            35:        if ((u_int)io->i_adapt >= nuba)
        !            36:                return (EADAPT);
        !            37:        if ((u_int)io->i_ctlr >= MAXCTLR)
        !            38:                return (ECTLR);
        !            39:        if (badaddr((char *)ubamem(io->i_unit, utstd[io->i_ctlr]), sizeof(short)))
        !            40:                return (ENXIO);
        !            41:        utstrategy(io, UT_REW);
        !            42:        for (skip = io->i_part; skip--;)
        !            43:                utstrategy(io, UT_SFORWF);
        !            44:        return (0);
        !            45: }
        !            46: 
        !            47: utclose(io)
        !            48:        register struct iob *io;
        !            49: {
        !            50:        utstrategy(io, UT_REW);
        !            51: }
        !            52: 
        !            53: #define        UTWAIT(addr) { \
        !            54:        do \
        !            55:                word = addr->utcs1; \
        !            56:        while((word&UT_RDY) == 0); \
        !            57: }
        !            58: 
        !            59: utstrategy(io, func)
        !            60:        register struct iob *io;
        !            61: {
        !            62:        register struct utdevice *addr;
        !            63:        register u_short word;
        !            64:        register int errcnt;
        !            65:        int info, resid;
        !            66:        u_short dens;
        !            67: 
        !            68:        addr = (struct utdevice *)ubamem(io->i_unit, utstd[io->i_ctlr]);
        !            69:        dens = io->i_unit | PDP11FMT | UT_PE;
        !            70:        errcnt = 0;
        !            71: retry:
        !            72:        utquiet(addr);
        !            73:        addr->uttc = dens;
        !            74:        info = ubasetup(io, 1);
        !            75:        addr->utwc = -((io->i_cc+1) >> 1);
        !            76:        addr->utfc = -io->i_cc;
        !            77:        if (func == READ) {
        !            78:                addr->utba = info;
        !            79:                addr->utcs1 = UT_RCOM | ((info>>8) & 0x30) | UT_GO;
        !            80:        } else if (func == WRITE) {
        !            81:                addr->utba = info;
        !            82:                addr->utcs1 = UT_WCOM | ((info>>8) & 0x30) | UT_GO;
        !            83:        } else if (func == UT_SREV) {
        !            84:                addr->utcs1 = UT_SREV | UT_GO;
        !            85:                return (0);
        !            86:        } else
        !            87:                addr->utcs1 = func | UT_GO;
        !            88:        UTWAIT(addr);
        !            89:        ubafree(io, info);
        !            90:        word = addr->utds;
        !            91:        if (word&(UTDS_EOT|UTDS_TM)) {
        !            92:                addr->utcs1 = UT_CLEAR | UT_GO;
        !            93:                goto done;
        !            94:        }
        !            95:        if ((word&UTDS_ERR) || (addr->utcs1&UT_TRE)) {
        !            96:                printf("ut error: cs1=%b er=%b cs2=%b ds=%b",
        !            97:                  addr->utcs1, UT_BITS, addr->uter, UTER_BITS,
        !            98:                  addr->utcs2, UTCS2_BITS, word, UTDS_BITS);
        !            99:                if (errcnt++ == 10) {
        !           100:                        printf("ut: unrecovered error\n");
        !           101:                        return (-1);
        !           102:                }
        !           103:                if (addr->utcs1&UT_TRE)
        !           104:                        addr->utcs2 |= UTCS2_CLR;
        !           105:                addr->utcs1 = UT_CLEAR | UT_GO;
        !           106:                utstrategy(io, UT_SREV);
        !           107:                utquiet(addr);
        !           108:                if (func == WRITE) {
        !           109:                        addr->utcs1 = UT_ERASE | UT_GO;
        !           110:                        UTWAIT(addr);
        !           111:                }
        !           112:                goto retry;
        !           113:        }
        !           114:        if (errcnt)
        !           115:                printf("ut: recovered by retry\n");
        !           116: done:
        !           117:        if (func == READ) {
        !           118:                resid = 0;
        !           119:                if (io->i_cc > MASKREG(addr->utfc))
        !           120:                        resid = io->i_cc - MASKREG(addr->utfc);
        !           121:        } else
        !           122:                resid = MASKREG(-addr->utfc);
        !           123:        return (io->i_cc - resid);
        !           124: }
        !           125: 
        !           126: static
        !           127: utquiet(addr)
        !           128:        register struct utdevice *addr;
        !           129: {
        !           130:        register u_short word;
        !           131: 
        !           132:        UTWAIT(addr);
        !           133:        do
        !           134:                word = addr->utds;
        !           135:        while ((word&UTDS_DRY) == 0 && (word&UTDS_PIP));
        !           136: }

unix.superglobalmegacorp.com

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