date and time created 83/08/01 12:10:12 by sam
[unix-history] / usr / src / sys / vax / stand / mba.c
CommitLineData
92e67171 1/* mba.c 6.1 83/07/29 */
faeec66d
SL
2
3#include "../machine/pte.h"
6810489f
BJ
4
5#include "../h/param.h"
6#include "../h/inode.h"
b5d17f4d 7#include "../h/fs.h"
6810489f 8#include "../h/vm.h"
a031a31b
SL
9
10#include "../vax/mtpr.h"
11#include "../vaxmba/mbareg.h"
514820ed 12#include "../vaxmba/hpreg.h"
a031a31b 13
6810489f 14#include "saio.h"
99fe9747 15#include "savax.h"
6810489f 16
99fe9747
BJ
17mbastart(io, func)
18 register struct iob *io;
19 int func;
6810489f 20{
99fe9747
BJ
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;
6810489f
BJ
24 int npf;
25 unsigned v;
6810489f
BJ
26 int o;
27 int vaddr;
6810489f 28
6810489f
BJ
29 v = btop(io->i_ma);
30 o = (int)io->i_ma & PGOFSET;
31 npf = btoc(io->i_cc + o);
99fe9747 32 vaddr = o;
6810489f
BJ
33 while (--npf >= 0)
34 *(int *)pte++ = v++ | PG_V;
99fe9747
BJ
35 mba->mba_sr = -1;
36 mba->mba_bcr = -io->i_cc;
37 mba->mba_var = vaddr;
5b34c67b 38 if (io->i_flgs&F_SSI)
ac670a09 39 drv->mbd_of |= HPOF_SSEI;
514820ed
HS
40 switch (io->i_flgs & F_TYPEMASK) {
41
42 case F_RDDATA: /* standard read */
43 drv->mbd_cs1 = MB_RCOM|MB_GO;
5f8a4923 44 mbawait(io);
514820ed
HS
45 return(0);
46
47 case F_WRDATA: /* standard write */
48 drv->mbd_cs1 = MB_WCOM|MB_GO;
5f8a4923 49 mbawait(io);
514820ed
HS
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:
5b34c67b 73 goto error;
514820ed 74 }
5f8a4923 75 mbawait(io);
514820ed
HS
76 if ((drv->mbd_dt & MBDT_TAP) == 0)
77 return (0);
5b34c67b
SL
78error:
79 io->i_error = ECMD;
80 io->i_flgs &= ~F_TYPEMASK;
81 return (1);
6810489f 82}
56a904c5 83
5f8a4923
SL
84mbawait(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
56a904c5
BJ
94mbainit(mbanum)
95 int mbanum;
96{
99fe9747 97 register struct mba_regs *mba = mbaddr[mbanum];
56a904c5 98
99fe9747
BJ
99 /* SHOULD BADADDR IT */
100 if (mbaact & (1<<mbanum))
101 return;
102 mba->mba_cr = MBCR_INIT;
56a904c5
BJ
103 mbaact |= 1<<mbanum;
104}