xref: /csrg-svn/sys/vax/stand/mba.c (revision 33408)
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