Annotation of 43BSD/sys/vax/crl.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:  *     @(#)crl.c       7.1 (Berkeley) 6/5/86
                      7:  */
                      8: /*
                      9:  * TO DO (tef  7/18/85):
                     10:  *     1) change printf's to log() instead???
                     11:  */
                     12: 
                     13: #if VAX8600
                     14: #include "param.h"
                     15: #include "systm.h"
                     16: #include "conf.h"
                     17: #include "dir.h"
                     18: #include "user.h"
                     19: #include "buf.h"
                     20: #include "uio.h"
                     21: 
                     22: #include "cons.h"
                     23: #include "cpu.h"
                     24: #include "crl.h"
                     25: #include "mtpr.h"
                     26: 
                     27: struct {
                     28:        short   crl_state;              /* open and busy flags */
                     29:        short   crl_active;             /* driver state flag */
                     30:        struct  buf *crl_buf;           /* buffer we're using */
                     31:        ushort *crl_xaddr;              /* transfer address */
                     32:        short   crl_errcnt;
                     33: } crltab;
                     34: 
                     35: struct {
                     36:        int     crl_cs;         /* saved controller status */
                     37:        int     crl_ds;         /* saved drive status */
                     38: } crlstat;
                     39: 
                     40: /*ARGSUSED*/
                     41: crlopen(dev, flag)
                     42:        dev_t dev;
                     43:        int flag;
                     44: {
                     45:        struct buf *geteblk();
                     46: 
                     47:        if (cpu != VAX_8600)
                     48:                return (ENXIO);
                     49:        if (crltab.crl_state != CRL_IDLE)
                     50:                return (EALREADY);
                     51:        crltab.crl_state = CRL_OPEN;
                     52:        crltab.crl_buf = geteblk(512);
                     53:        return (0);
                     54: }
                     55: 
                     56: /*ARGSUSED*/
                     57: crlclose(dev, flag)
                     58:        dev_t dev;
                     59:        int flag;
                     60: {
                     61: 
                     62:        brelse(crltab.crl_buf);
                     63:        crltab.crl_state = CRL_IDLE;
                     64: }
                     65: 
                     66: crloperation(rw, uio)
                     67:        enum uio_rw rw;
                     68:        struct uio *uio;
                     69: {
                     70:        register struct buf *bp;
                     71:        register int i;
                     72:        register int s;
                     73:        int error;
                     74: 
                     75:        if (uio->uio_resid == 0) 
                     76:                return (0);
                     77:        s = spl4();
                     78:        while (crltab.crl_state & CRL_BUSY)
                     79:                sleep((caddr_t)&crltab, PRIBIO);
                     80:        crltab.crl_state |= CRL_BUSY;
                     81:        splx(s);
                     82: 
                     83:        bp = crltab.crl_buf;
                     84:        error = 0;
                     85:        while ((i = imin(CRLBYSEC, uio->uio_resid)) > 0) {
                     86:                bp->b_blkno = uio->uio_offset>>9;
                     87:                if (bp->b_blkno >= MAXSEC || (uio->uio_offset & 0x1FF) != 0) {
                     88:                        error = EIO;
                     89:                        break;
                     90:                }
                     91:                if (rw == UIO_WRITE) {
                     92:                        error = uiomove(bp->b_un.b_addr, i, UIO_WRITE, uio);
                     93:                        if (error)
                     94:                                break;
                     95:                }
                     96:                bp->b_flags = rw == UIO_WRITE ? B_WRITE : B_READ;
                     97:                s = spl4(); 
                     98:                crlstart();
                     99:                while ((bp->b_flags & B_DONE) == 0)
                    100:                        sleep((caddr_t)bp, PRIBIO);     
                    101:                splx(s);
                    102:                if (bp->b_flags & B_ERROR) {
                    103:                        error = EIO;
                    104:                        break;
                    105:                }
                    106:                if (rw == UIO_READ) {
                    107:                        error = uiomove(bp->b_un.b_addr, i, UIO_READ, uio);
                    108:                        if (error)
                    109:                                break;
                    110:                }
                    111:        }
                    112:        crltab.crl_state &= ~CRL_BUSY;
                    113:        wakeup((caddr_t)&crltab);
                    114:        return (error);
                    115: }
                    116: 
                    117: /*ARGSUSED*/
                    118: crlread(dev, uio)
                    119:        dev_t dev;
                    120:        struct uio *uio;
                    121: {
                    122: 
                    123:        return (crloperation(UIO_READ, uio));
                    124: }
                    125: 
                    126: /*ARGSUSED*/
                    127: crlwrite(dev, uio)
                    128:        dev_t dev;
                    129:        struct uio *uio;
                    130: {
                    131: 
                    132:        return (crloperation(UIO_WRITE, uio));
                    133: }
                    134: 
                    135: crlstart()
                    136: {
                    137:        register struct buf *bp;
                    138: 
                    139:        bp = crltab.crl_buf;
                    140:        crltab.crl_errcnt = 0;
                    141:        crltab.crl_xaddr = (ushort *) bp->b_un.b_addr;
                    142:        bp->b_resid = 0;
                    143: 
                    144:        if ((mfpr(STXCS) & STXCS_RDY) == 0)
                    145:                /* not ready to receive order */
                    146:                return;
                    147:        if ((bp->b_flags&(B_READ|B_WRITE)) == B_READ) {
                    148:                crltab.crl_active = CRL_F_READ;
                    149:                mtpr(STXCS, bp->b_blkno<<8 | STXCS_IE | CRL_F_READ);
                    150:        } else {
                    151:                crltab.crl_active = CRL_F_WRITE;
                    152:                mtpr(STXCS, bp->b_blkno<<8 | STXCS_IE | CRL_F_WRITE);
                    153:        }
                    154: #ifdef lint
                    155:        crlintr();
                    156: #endif
                    157: }
                    158: 
                    159: crlintr()
                    160: {
                    161:        register struct buf *bp;
                    162:        int i;
                    163: 
                    164:        bp = crltab.crl_buf;
                    165:        i = mfpr(STXCS);
                    166:        switch ((i>>24) & 0xFF) {
                    167: 
                    168:        case CRL_S_XCMPLT:
                    169:                switch (crltab.crl_active) {
                    170: 
                    171:                case CRL_F_RETSTS:
                    172:                        crlstat.crl_ds = mfpr(STXDB);
                    173:                        printf("crlcs=0x%b, crlds=0x%b\n", crlstat.crl_cs,
                    174:                                CRLCS_BITS, crlstat.crl_ds, CRLDS_BITS); 
                    175:                        break;
                    176: 
                    177:                case CRL_F_READ:
                    178:                case CRL_F_WRITE:
                    179:                        bp->b_flags |= B_DONE;
                    180:                }
                    181:                crltab.crl_active = 0;
                    182:                wakeup((caddr_t)bp);
                    183:                break;
                    184: 
                    185:        case CRL_S_XCONT:
                    186:                switch (crltab.crl_active) {
                    187: 
                    188:                case CRL_F_WRITE:
                    189:                        mtpr(STXDB, *crltab.crl_xaddr++);
                    190:                        mtpr(STXCS, bp->b_blkno<<8 | STXCS_IE | CRL_F_WRITE);
                    191:                        break;
                    192: 
                    193:                case CRL_F_READ:
                    194:                        *crltab.crl_xaddr++ = mfpr(STXDB);
                    195:                        mtpr(STXCS, bp->b_blkno<<8 | STXCS_IE | CRL_F_READ);
                    196:                }
                    197:                break;
                    198: 
                    199:        case CRL_S_ABORT:
                    200:                crltab.crl_active = CRL_F_RETSTS;
                    201:                mtpr(STXCS, STXCS_IE | CRL_F_RETSTS);
                    202:                bp->b_flags |= B_DONE|B_ERROR;
                    203:                break;
                    204: 
                    205:        case CRL_S_RETSTS:
                    206:                crlstat.crl_cs = mfpr(STXDB);
                    207:                mtpr(STXCS, STXCS_IE | CRL_S_RETSTS);
                    208:                break;
                    209: 
                    210:        case CRL_S_HNDSHK:
                    211:                printf("crl: hndshk error\n");  /* dump out some status too? */
                    212:                crltab.crl_active = 0;
                    213:                bp->b_flags |= B_DONE|B_ERROR;
                    214:                wakeup((caddr_t)bp);
                    215:                break;
                    216: 
                    217:        case CRL_S_HWERR:
                    218:                printf("crl: hard error sn%d\n", bp->b_blkno);
                    219:                crltab.crl_active = CRL_F_ABORT;
                    220:                mtpr(STXCS, STXCS_IE | CRL_F_ABORT);
                    221:                break;
                    222:        }
                    223: }
                    224: #endif

unix.superglobalmegacorp.com

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