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.2 (Berkeley) 02/21/87 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 if (badaddr((char *)mba, sizeof(long))) 106 return (0); 107 if (mbaact & (1<<mbanum)) 108 return (1); 109 mba->mba_cr = MBCR_INIT; 110 mbaact |= 1<<mbanum; 111 return (1); 112 } 113