Commit | Line | Data |
---|---|---|
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 |
17 | mbastart(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 |
78 | error: |
79 | io->i_error = ECMD; | |
80 | io->i_flgs &= ~F_TYPEMASK; | |
81 | return (1); | |
6810489f | 82 | } |
56a904c5 | 83 | |
5f8a4923 SL |
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 | ||
56a904c5 BJ |
94 | mbainit(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 | } |