|
|
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.3 (Berkeley) 2/17/90 ! 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 "user.h" ! 18: #include "buf.h" ! 19: ! 20: #include "cons.h" ! 21: #include "cpu.h" ! 22: #include "crl.h" ! 23: #include "mtpr.h" ! 24: ! 25: struct { ! 26: short crl_state; /* open and busy flags */ ! 27: short crl_active; /* driver state flag */ ! 28: struct buf *crl_buf; /* buffer we're using */ ! 29: ushort *crl_xaddr; /* transfer address */ ! 30: short crl_errcnt; ! 31: } crltab; ! 32: ! 33: struct { ! 34: int crl_cs; /* saved controller status */ ! 35: int crl_ds; /* saved drive status */ ! 36: } crlstat; ! 37: ! 38: /*ARGSUSED*/ ! 39: crlopen(dev, flag) ! 40: dev_t dev; ! 41: int flag; ! 42: { ! 43: struct buf *geteblk(); ! 44: ! 45: if (cpu != VAX_8600) ! 46: return (ENXIO); ! 47: if (crltab.crl_state != CRL_IDLE) ! 48: return (EALREADY); ! 49: crltab.crl_state = CRL_OPEN; ! 50: crltab.crl_buf = geteblk(512); ! 51: return (0); ! 52: } ! 53: ! 54: /*ARGSUSED*/ ! 55: crlclose(dev, flag) ! 56: dev_t dev; ! 57: int flag; ! 58: { ! 59: ! 60: brelse(crltab.crl_buf); ! 61: crltab.crl_state = CRL_IDLE; ! 62: } ! 63: ! 64: /*ARGSUSED*/ ! 65: crlrw(dev, uio, flag) ! 66: dev_t dev; ! 67: struct uio *uio; ! 68: int flag; ! 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 (uio->uio_rw == UIO_WRITE) { ! 92: error = uiomove(bp->b_un.b_addr, i, uio); ! 93: if (error) ! 94: break; ! 95: } ! 96: bp->b_flags = uio->uio_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 (uio->uio_rw == UIO_READ) { ! 107: error = uiomove(bp->b_un.b_addr, i, 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: crlstart() ! 118: { ! 119: register struct buf *bp; ! 120: ! 121: bp = crltab.crl_buf; ! 122: crltab.crl_errcnt = 0; ! 123: crltab.crl_xaddr = (ushort *) bp->b_un.b_addr; ! 124: bp->b_resid = 0; ! 125: ! 126: if ((mfpr(STXCS) & STXCS_RDY) == 0) ! 127: /* not ready to receive order */ ! 128: return; ! 129: if ((bp->b_flags&(B_READ|B_WRITE)) == B_READ) { ! 130: crltab.crl_active = CRL_F_READ; ! 131: mtpr(STXCS, bp->b_blkno<<8 | STXCS_IE | CRL_F_READ); ! 132: } else { ! 133: crltab.crl_active = CRL_F_WRITE; ! 134: mtpr(STXCS, bp->b_blkno<<8 | STXCS_IE | CRL_F_WRITE); ! 135: } ! 136: #ifdef lint ! 137: crlintr(); ! 138: #endif ! 139: } ! 140: ! 141: crlintr() ! 142: { ! 143: register struct buf *bp; ! 144: int i; ! 145: ! 146: bp = crltab.crl_buf; ! 147: i = mfpr(STXCS); ! 148: switch ((i>>24) & 0xFF) { ! 149: ! 150: case CRL_S_XCMPLT: ! 151: switch (crltab.crl_active) { ! 152: ! 153: case CRL_F_RETSTS: ! 154: crlstat.crl_ds = mfpr(STXDB); ! 155: printf("crlcs=0x%b, crlds=0x%b\n", crlstat.crl_cs, ! 156: CRLCS_BITS, crlstat.crl_ds, CRLDS_BITS); ! 157: break; ! 158: ! 159: case CRL_F_READ: ! 160: case CRL_F_WRITE: ! 161: bp->b_flags |= B_DONE; ! 162: } ! 163: crltab.crl_active = 0; ! 164: wakeup((caddr_t)bp); ! 165: break; ! 166: ! 167: case CRL_S_XCONT: ! 168: switch (crltab.crl_active) { ! 169: ! 170: case CRL_F_WRITE: ! 171: mtpr(STXDB, *crltab.crl_xaddr++); ! 172: mtpr(STXCS, bp->b_blkno<<8 | STXCS_IE | CRL_F_WRITE); ! 173: break; ! 174: ! 175: case CRL_F_READ: ! 176: *crltab.crl_xaddr++ = mfpr(STXDB); ! 177: mtpr(STXCS, bp->b_blkno<<8 | STXCS_IE | CRL_F_READ); ! 178: } ! 179: break; ! 180: ! 181: case CRL_S_ABORT: ! 182: crltab.crl_active = CRL_F_RETSTS; ! 183: mtpr(STXCS, STXCS_IE | CRL_F_RETSTS); ! 184: bp->b_flags |= B_DONE|B_ERROR; ! 185: break; ! 186: ! 187: case CRL_S_RETSTS: ! 188: crlstat.crl_cs = mfpr(STXDB); ! 189: mtpr(STXCS, STXCS_IE | CRL_S_RETSTS); ! 190: break; ! 191: ! 192: case CRL_S_HNDSHK: ! 193: printf("crl: hndshk error\n"); /* dump out some status too? */ ! 194: crltab.crl_active = 0; ! 195: bp->b_flags |= B_DONE|B_ERROR; ! 196: wakeup((caddr_t)bp); ! 197: break; ! 198: ! 199: case CRL_S_HWERR: ! 200: printf("crl: hard error sn%d\n", bp->b_blkno); ! 201: crltab.crl_active = CRL_F_ABORT; ! 202: mtpr(STXCS, STXCS_IE | CRL_F_ABORT); ! 203: break; ! 204: } ! 205: } ! 206: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.