Annotation of researchv9/sys/boot/stand/devio.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * @(#)devio.c 1.1 86/02/03 Copyright (c) 1985 by Sun Microsystems, Inc.
        !             3:  */
        !             4: 
        !             5: /*
        !             6:  * Device interface code for standalone I/O system.
        !             7:  *
        !             8:  * Most simply indirect thru the table to call the "right" routine.
        !             9:  */
        !            10: 
        !            11: #include "../mon/sunromvec.h"
        !            12: #include "saio.h"
        !            13: #include "param.h"
        !            14: 
        !            15: /*
        !            16:  * Strategy -- handles I/O in large blocks for drivers.
        !            17:  * (This routine is private to this file.)
        !            18:  *
        !            19:  * If a devread() or devwrite() is attempted which is larger
        !            20:  * than the max I/O size for this device, break it up into a
        !            21:  * series of max-sized operations.
        !            22:  *
        !            23:  * Devices which do not declare a max size get the whole thing.
        !            24:  */
        !            25: static int
        !            26: strategy(sip, rw)
        !            27:        register struct saioreq *sip;
        !            28:        int rw;
        !            29: {
        !            30:        register char *ma;
        !            31:        register unsigned cc;
        !            32:        register daddr_t bn;
        !            33:        register int errs;
        !            34:        register unsigned maxsize;
        !            35:        register struct devinfo *dp;
        !            36: 
        !            37:        if (rw == READ && (sip->si_flgs & F_EOF)) {
        !            38:                sip->si_flgs &= ~F_EOF;
        !            39:                return (0);
        !            40:        }
        !            41:        ma = sip->si_ma;                        /* Save for later */
        !            42:        bn = sip->si_bn;
        !            43:        cc = sip->si_cc;
        !            44: 
        !            45:        dp = sip->si_boottab->b_devinfo;
        !            46:        if (dp && (maxsize = dp->d_maxiobytes) != 0 &&
        !            47:            ((maxsize & (DEV_BSIZE-1)) == 0))
        !            48:                ;
        !            49:        else
        !            50:                maxsize = 0x7FFFFFFF;
        !            51:        errs = 0;
        !            52:        while (sip->si_cc > 0) {
        !            53:                if (sip->si_cc > maxsize)
        !            54:                        sip->si_cc = maxsize;
        !            55:                errs = (*sip->si_boottab->b_strategy)(sip, rw);
        !            56:                /* short read is expected for 1/2" tape */
        !            57:                if (errs <= 0)          /* error or EOF */
        !            58:                        break;
        !            59:                sip->si_ma += errs;
        !            60:                sip->si_bn += errs / DEV_BSIZE;
        !            61:                sip->si_cc = cc - (sip->si_ma - ma);
        !            62:        }
        !            63:        if (errs == 0)
        !            64:                sip->si_flgs |= F_EOF;
        !            65:        if (errs >= 0)
        !            66:                errs = sip->si_ma - ma;         /* Add the part we did before */
        !            67:        if (errs == 0)
        !            68:                sip->si_flgs &= ~F_EOF;
        !            69:        sip->si_ma = ma;                        /* Restore */
        !            70:        sip->si_bn = bn;
        !            71:        sip->si_cc = cc;
        !            72:        return errs;
        !            73: }
        !            74: 
        !            75: int
        !            76: devread(sip)
        !            77:        struct saioreq *sip;
        !            78: {
        !            79: 
        !            80:        return(strategy(sip, READ));
        !            81: }
        !            82: 
        !            83: int
        !            84: devwrite(sip)
        !            85:        struct saioreq *sip;
        !            86: {
        !            87: 
        !            88:        return(strategy(sip, WRITE));
        !            89: }
        !            90: 
        !            91: int
        !            92: devopen(sip)
        !            93:        register struct saioreq *sip;
        !            94: {
        !            95:        register struct devinfo *dp;
        !            96:        register char *a;
        !            97:        register int result;
        !            98: 
        !            99:        sip->si_flgs &= ~F_EOF;
        !           100:        sip->si_devaddr = sip->si_devdata = sip->si_dmaaddr = (char *)0;
        !           101:        dp = sip->si_boottab->b_devinfo;
        !           102:        if (dp) {
        !           103:                /* Map controller number into controller address */
        !           104:                if (sip->si_ctlr < dp->d_stdcount) {
        !           105:                        sip->si_ctlr = (int)((dp->d_stdaddrs)[sip->si_ctlr]);
        !           106:                }
        !           107:                /* Map in device itself */
        !           108:                if (dp->d_devbytes) {
        !           109:                        a = devalloc(dp->d_devtype, sip->si_ctlr,
        !           110:                                dp->d_devbytes);
        !           111:                        if (!a)
        !           112:                                goto bad;
        !           113:                        sip->si_devaddr = a;
        !           114:                }
        !           115:                if (dp->d_dmabytes) {
        !           116:                        a = resalloc(RES_DMAMEM, dp->d_dmabytes);
        !           117:                        if (!a) 
        !           118:                                goto bad;
        !           119:                        sip->si_dmaaddr = a;
        !           120:                }
        !           121:                if (dp->d_localbytes) {
        !           122:                        a = resalloc(RES_MAINMEM, dp->d_localbytes);
        !           123:                        if (!a) 
        !           124:                                goto bad;
        !           125:                        sip->si_devdata = a;
        !           126:                }
        !           127:        }
        !           128: 
        !           129:        result = (sip->si_boottab->b_open)(sip);
        !           130:        if (result != -1)
        !           131:                return result;
        !           132: bad:
        !           133:        return -1;              /* Indicate failure */
        !           134: }
        !           135: 
        !           136: devclose(sip)
        !           137:        register struct saioreq *sip;
        !           138: {
        !           139: 
        !           140:        sip->si_flgs &= ~F_EOF;
        !           141:        (sip->si_boottab->b_close)(sip);
        !           142: }

unix.superglobalmegacorp.com

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