123234Smckusick /* 229303Smckusick * Copyright (c) 1982, 1986 Regents of the University of California. 323234Smckusick * All rights reserved. The Berkeley software License Agreement 423234Smckusick * specifies the terms and conditions for redistribution. 523234Smckusick * 6*33408Skarels * @(#)mba.c 7.2 (Berkeley) 2/21/87 723234Smckusick */ 8323Sbill 99806Ssam #include "../machine/pte.h" 109806Ssam 11*33408Skarels #include "param.h" 12*33408Skarels #include "inode.h" 13*33408Skarels #include "fs.h" 14*33408Skarels #include "vm.h" 159186Ssam 169186Ssam #include "../vax/mtpr.h" 179186Ssam #include "../vaxmba/mbareg.h" 1810332Shelge #include "../vaxmba/hpreg.h" 199186Ssam 20323Sbill #include "saio.h" 213262Swnj #include "savax.h" 22323Sbill 233262Swnj mbastart(io, func) 243262Swnj register struct iob *io; 253262Swnj int func; 26323Sbill { 273262Swnj struct mba_regs *mba = mbamba(io->i_unit); 283262Swnj struct mba_drv *drv = mbadrv(io->i_unit); 293262Swnj register struct pte *pte = mba->mba_map; 30323Sbill int npf; 31323Sbill unsigned v; 32323Sbill int o; 33323Sbill int vaddr; 34323Sbill 35323Sbill v = btop(io->i_ma); 36323Sbill o = (int)io->i_ma & PGOFSET; 37323Sbill npf = btoc(io->i_cc + o); 383262Swnj vaddr = o; 39323Sbill while (--npf >= 0) 40323Sbill *(int *)pte++ = v++ | PG_V; 413262Swnj mba->mba_sr = -1; 423262Swnj mba->mba_bcr = -io->i_cc; 433262Swnj mba->mba_var = vaddr; 4411142Ssam if (io->i_flgs&F_SSI) 4510623Shelge drv->mbd_of |= HPOF_SSEI; 4610332Shelge switch (io->i_flgs & F_TYPEMASK) { 4710332Shelge 4810332Shelge case F_RDDATA: /* standard read */ 4910332Shelge drv->mbd_cs1 = MB_RCOM|MB_GO; 5013569Ssam mbawait(io); 5110332Shelge return(0); 5210332Shelge 5310332Shelge case F_WRDATA: /* standard write */ 5410332Shelge drv->mbd_cs1 = MB_WCOM|MB_GO; 5513569Ssam mbawait(io); 5610332Shelge return(0); 5710332Shelge 5810332Shelge /* the following commands apply to disks only */ 5910332Shelge 6010332Shelge case F_HDR|F_RDDATA: 6110332Shelge drv->mbd_cs1 = HP_RHDR|HP_GO; 6210332Shelge break; 6310332Shelge 6410332Shelge case F_HDR|F_WRDATA: 6510332Shelge drv->mbd_cs1 = HP_WHDR|HP_GO; 6610332Shelge break; 6710332Shelge 6810332Shelge case F_CHECK|F_WRDATA: 6910332Shelge case F_CHECK|F_RDDATA: 7010332Shelge drv->mbd_cs1 = HP_WCDATA|HP_GO; 7110332Shelge break; 7210332Shelge 7310332Shelge case F_HCHECK|F_WRDATA: 7410332Shelge case F_HCHECK|F_RDDATA: 7510332Shelge drv->mbd_cs1 = HP_WCHDR|HP_GO; 7610332Shelge break; 7710332Shelge 7810332Shelge default: 7911142Ssam goto error; 8010332Shelge } 8113569Ssam mbawait(io); 8210332Shelge if ((drv->mbd_dt & MBDT_TAP) == 0) 8310332Shelge return (0); 8411142Ssam error: 8511142Ssam io->i_error = ECMD; 8611142Ssam io->i_flgs &= ~F_TYPEMASK; 8711142Ssam return (1); 88323Sbill } 89415Sbill 9013569Ssam mbawait(io) 9113569Ssam register struct iob *io; 9213569Ssam { 9313569Ssam struct mba_regs *mba = mbamba(io->i_unit); 9413569Ssam struct mba_drv *drv = mbadrv(io->i_unit); 9513569Ssam 9613569Ssam while (mba->mba_sr & MBSR_DTBUSY) 9713569Ssam DELAY(100); 9813569Ssam } 9913569Ssam 100415Sbill mbainit(mbanum) 101415Sbill int mbanum; 102415Sbill { 1033262Swnj register struct mba_regs *mba = mbaddr[mbanum]; 104415Sbill 105*33408Skarels if (badaddr((char *)mba, sizeof(long))) { 106*33408Skarels printf("nonexistent mba"); 10730547Skarels return (0); 108*33408Skarels } 109*33408Skarels if ((mbaact & (1<<mbanum)) == 0) { 110*33408Skarels mba->mba_cr = MBCR_INIT; 111*33408Skarels mbaact |= 1<<mbanum; 112*33408Skarels } 11330547Skarels return (1); 114415Sbill } 115