xref: /original-bsd/sys/vax/stand/mba.c (revision 2301fdfb)
1 /*
2  * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)mba.c	7.6 (Berkeley) 07/09/88
7  */
8 
9 #include "../machine/pte.h"
10 
11 #include "param.h"
12 #include "inode.h"
13 #include "fs.h"
14 #include "vm.h"
15 
16 #include "../vax/mtpr.h"
17 #include "../vaxmba/mbareg.h"
18 #include "../vaxmba/hpreg.h"
19 
20 #include "saio.h"
21 #include "savax.h"
22 
23 mbastart(io, unit, func)
24 	register struct iob *io;
25 	int unit, func;
26 {
27 	struct mba_regs *mba = mbamba(io->i_adapt);
28 	struct mba_drv *drv = mbadrv(io->i_adapt, unit);
29 	register struct pte *pte = mba->mba_map;
30 	unsigned int v;
31 	int npf, o, vaddr;
32 
33 	v = btop(io->i_ma);
34 	o = (int)io->i_ma & PGOFSET;
35 	npf = btoc(io->i_cc + o);
36 	vaddr = o;
37 	while (--npf >= 0)
38 		*(int *)pte++ = v++ | PG_V;
39 	mba->mba_sr = -1;
40 	mba->mba_bcr = -io->i_cc;
41 	mba->mba_var = vaddr;
42 	if (io->i_flgs&F_SSI)
43 		drv->mbd_of |= HPOF_SSEI;
44 	switch (io->i_flgs & F_TYPEMASK) {
45 
46 	case F_RDDATA:			/* standard read */
47 		drv->mbd_cs1 = MB_RCOM|MB_GO;
48 		mbawait(io, unit);
49 		return(0);
50 
51 	case F_WRDATA:			/* standard write */
52 		drv->mbd_cs1 = MB_WCOM|MB_GO;
53 		mbawait(io, unit);
54 		return(0);
55 
56 	/* the following commands apply to disks only */
57 
58 	case F_HDR|F_RDDATA:
59 		drv->mbd_cs1 = HP_RHDR|HP_GO;
60 		break;
61 
62 	case F_HDR|F_WRDATA:
63 		drv->mbd_cs1 = HP_WHDR|HP_GO;
64 		break;
65 
66 	case F_CHECK|F_WRDATA:
67 	case F_CHECK|F_RDDATA:
68 		drv->mbd_cs1 = HP_WCDATA|HP_GO;
69 		break;
70 
71 	case F_HCHECK|F_WRDATA:
72 	case F_HCHECK|F_RDDATA:
73 		drv->mbd_cs1 = HP_WCHDR|HP_GO;
74 		break;
75 
76 	default:
77 		goto error;
78 	}
79 	mbawait(io, unit);
80 	if ((drv->mbd_dt & MBDT_TAP) == 0)
81 		return (0);
82 error:
83 	io->i_error = ECMD;
84 	io->i_flgs &= ~F_TYPEMASK;
85 	return (1);
86 }
87 
88 mbawait(io, unit)
89 	register struct iob *io;
90 	int unit;
91 {
92 	struct mba_regs *mba = mbamba(io->i_adapt);
93 	struct mba_drv *drv = mbadrv(io->i_adapt, unit);
94 
95 	while (mba->mba_sr & MBSR_DTBUSY)
96 		DELAY(100);
97 }
98 
99 mbainit(mbanum)
100 	int mbanum;
101 {
102 	register struct mba_regs *mba;
103 
104 	if (mbanum >= nmba)
105 		return (0);
106 	mba = mbaddr[mbanum];
107 	if (badaddr((char *)mba, sizeof(long)))
108 		return (0);
109 	if ((mbaact & (1<<mbanum)) == 0) {
110 		mba->mba_cr = MBCR_INIT;
111 		mbaact |= 1<<mbanum;
112 	}
113 	return (1);
114 }
115