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