Annotation of researchv9/sys/boot/stand/devio.c, revision 1.1.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.