123234Smckusick /*
235052Skarels * Copyright (c) 1982, 1986, 1988 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*45803Sbostic * @(#)mba.c 7.9 (Berkeley) 12/16/90
723234Smckusick */
8323Sbill
9*45803Sbostic #include "../include/pte.h"
109806Ssam
11*45803Sbostic #include "sys/param.h"
12*45803Sbostic #include "sys/vm.h"
139186Ssam
14*45803Sbostic #include "../include/mtpr.h"
15*45803Sbostic #include "../mba/mbareg.h"
16*45803Sbostic #include "../mba/hpreg.h"
179186Ssam
18*45803Sbostic #include "stand/saio.h"
193262Swnj #include "savax.h"
20323Sbill
mbastart(io,unit,func)2133528Sbostic mbastart(io, unit, func)
223262Swnj register struct iob *io;
2333528Sbostic int unit, func;
24323Sbill {
2533528Sbostic struct mba_regs *mba = mbamba(io->i_adapt);
2633528Sbostic struct mba_drv *drv = mbadrv(io->i_adapt, unit);
273262Swnj register struct pte *pte = mba->mba_map;
2833528Sbostic unsigned int v;
2933528Sbostic int npf, o, vaddr;
30323Sbill
31323Sbill v = btop(io->i_ma);
32323Sbill o = (int)io->i_ma & PGOFSET;
33323Sbill npf = btoc(io->i_cc + o);
343262Swnj vaddr = o;
35323Sbill while (--npf >= 0)
36323Sbill *(int *)pte++ = v++ | PG_V;
373262Swnj mba->mba_sr = -1;
383262Swnj mba->mba_bcr = -io->i_cc;
393262Swnj mba->mba_var = vaddr;
4011142Ssam if (io->i_flgs&F_SSI)
4110623Shelge drv->mbd_of |= HPOF_SSEI;
4210332Shelge switch (io->i_flgs & F_TYPEMASK) {
4310332Shelge
4410332Shelge case F_RDDATA: /* standard read */
4510332Shelge drv->mbd_cs1 = MB_RCOM|MB_GO;
4633528Sbostic mbawait(io, unit);
4710332Shelge return(0);
4810332Shelge
4910332Shelge case F_WRDATA: /* standard write */
5010332Shelge drv->mbd_cs1 = MB_WCOM|MB_GO;
5133528Sbostic mbawait(io, unit);
5210332Shelge return(0);
5310332Shelge
5410332Shelge /* the following commands apply to disks only */
5510332Shelge
5610332Shelge case F_HDR|F_RDDATA:
5710332Shelge drv->mbd_cs1 = HP_RHDR|HP_GO;
5810332Shelge break;
5910332Shelge
6010332Shelge case F_HDR|F_WRDATA:
6110332Shelge drv->mbd_cs1 = HP_WHDR|HP_GO;
6210332Shelge break;
6310332Shelge
6410332Shelge case F_CHECK|F_WRDATA:
6510332Shelge case F_CHECK|F_RDDATA:
6610332Shelge drv->mbd_cs1 = HP_WCDATA|HP_GO;
6710332Shelge break;
6810332Shelge
6910332Shelge case F_HCHECK|F_WRDATA:
7010332Shelge case F_HCHECK|F_RDDATA:
7110332Shelge drv->mbd_cs1 = HP_WCHDR|HP_GO;
7210332Shelge break;
7310332Shelge
7410332Shelge default:
7511142Ssam goto error;
7610332Shelge }
7733528Sbostic mbawait(io, unit);
7810332Shelge if ((drv->mbd_dt & MBDT_TAP) == 0)
7910332Shelge return (0);
8011142Ssam error:
8111142Ssam io->i_error = ECMD;
8211142Ssam io->i_flgs &= ~F_TYPEMASK;
8311142Ssam return (1);
84323Sbill }
85415Sbill
mbawait(io,unit)8633528Sbostic mbawait(io, unit)
8713569Ssam register struct iob *io;
8833528Sbostic int unit;
8913569Ssam {
9033528Sbostic struct mba_regs *mba = mbamba(io->i_adapt);
9133528Sbostic struct mba_drv *drv = mbadrv(io->i_adapt, unit);
9213569Ssam
9313569Ssam while (mba->mba_sr & MBSR_DTBUSY)
9413569Ssam DELAY(100);
9513569Ssam }
9613569Ssam
mbainit(mbanum)97415Sbill mbainit(mbanum)
98415Sbill int mbanum;
99415Sbill {
10035052Skarels register struct mba_regs *mba;
101415Sbill
10235052Skarels if (mbanum >= nmba)
10335052Skarels return (0);
10435052Skarels mba = mbaddr[mbanum];
10533552Sbostic if (badaddr((char *)mba, sizeof(long)))
10630547Skarels return (0);
10733408Skarels if ((mbaact & (1<<mbanum)) == 0) {
10833408Skarels mba->mba_cr = MBCR_INIT;
10933408Skarels mbaact |= 1<<mbanum;
11033408Skarels }
11130547Skarels return (1);
112415Sbill }
113