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