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