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: * @(#)mba.c 7.1 (Berkeley) 6/5/86 7: */ 8: 9: #include "../machine/pte.h" 10: 11: #include "../h/param.h" 12: #include "../h/inode.h" 13: #include "../h/fs.h" 14: #include "../h/vm.h" 15: 16: #include "../vax/mtpr.h" 17: #include "../vaxmba/mbareg.h" 18: #include "../vaxmba/hpreg.h" 19: 20: #include "saio.h" 21: #include "savax.h" 22: 23: mbastart(io, func) 24: register struct iob *io; 25: int func; 26: { 27: struct mba_regs *mba = mbamba(io->i_unit); 28: struct mba_drv *drv = mbadrv(io->i_unit); 29: register struct pte *pte = mba->mba_map; 30: int npf; 31: unsigned v; 32: int o; 33: int vaddr; 34: 35: v = btop(io->i_ma); 36: o = (int)io->i_ma & PGOFSET; 37: npf = btoc(io->i_cc + o); 38: vaddr = o; 39: while (--npf >= 0) 40: *(int *)pte++ = v++ | PG_V; 41: mba->mba_sr = -1; 42: mba->mba_bcr = -io->i_cc; 43: mba->mba_var = vaddr; 44: if (io->i_flgs&F_SSI) 45: drv->mbd_of |= HPOF_SSEI; 46: switch (io->i_flgs & F_TYPEMASK) { 47: 48: case F_RDDATA: /* standard read */ 49: drv->mbd_cs1 = MB_RCOM|MB_GO; 50: mbawait(io); 51: return(0); 52: 53: case F_WRDATA: /* standard write */ 54: drv->mbd_cs1 = MB_WCOM|MB_GO; 55: mbawait(io); 56: return(0); 57: 58: /* the following commands apply to disks only */ 59: 60: case F_HDR|F_RDDATA: 61: drv->mbd_cs1 = HP_RHDR|HP_GO; 62: break; 63: 64: case F_HDR|F_WRDATA: 65: drv->mbd_cs1 = HP_WHDR|HP_GO; 66: break; 67: 68: case F_CHECK|F_WRDATA: 69: case F_CHECK|F_RDDATA: 70: drv->mbd_cs1 = HP_WCDATA|HP_GO; 71: break; 72: 73: case F_HCHECK|F_WRDATA: 74: case F_HCHECK|F_RDDATA: 75: drv->mbd_cs1 = HP_WCHDR|HP_GO; 76: break; 77: 78: default: 79: goto error; 80: } 81: mbawait(io); 82: if ((drv->mbd_dt & MBDT_TAP) == 0) 83: return (0); 84: error: 85: io->i_error = ECMD; 86: io->i_flgs &= ~F_TYPEMASK; 87: return (1); 88: } 89: 90: mbawait(io) 91: register struct iob *io; 92: { 93: struct mba_regs *mba = mbamba(io->i_unit); 94: struct mba_drv *drv = mbadrv(io->i_unit); 95: 96: while (mba->mba_sr & MBSR_DTBUSY) 97: DELAY(100); 98: } 99: 100: mbainit(mbanum) 101: int mbanum; 102: { 103: register struct mba_regs *mba = mbaddr[mbanum]; 104: 105: /* SHOULD BADADDR IT */ 106: if (mbaact & (1<<mbanum)) 107: return; 108: mba->mba_cr = MBCR_INIT; 109: mbaact |= 1<<mbanum; 110: }