Commit | Line | Data |
---|---|---|
55b4dbd0 | 1 | /* |
99152021 | 2 | * Copyright (c) 1982, 1986, 1988 Regents of the University of California. |
55b4dbd0 KM |
3 | * All rights reserved. The Berkeley software License Agreement |
4 | * specifies the terms and conditions for redistribution. | |
5 | * | |
c18e27ed | 6 | * @(#)mba.c 7.7 (Berkeley) %G% |
55b4dbd0 | 7 | */ |
faeec66d | 8 | |
c18e27ed | 9 | #include "machine/pte.h" |
6810489f | 10 | |
39c71180 MK |
11 | #include "param.h" |
12 | #include "inode.h" | |
13 | #include "fs.h" | |
14 | #include "vm.h" | |
a031a31b SL |
15 | |
16 | #include "../vax/mtpr.h" | |
17 | #include "../vaxmba/mbareg.h" | |
514820ed | 18 | #include "../vaxmba/hpreg.h" |
a031a31b | 19 | |
6810489f | 20 | #include "saio.h" |
99fe9747 | 21 | #include "savax.h" |
6810489f | 22 | |
1e07c79f | 23 | mbastart(io, unit, func) |
99fe9747 | 24 | register struct iob *io; |
1e07c79f | 25 | int unit, func; |
6810489f | 26 | { |
1e07c79f KB |
27 | struct mba_regs *mba = mbamba(io->i_adapt); |
28 | struct mba_drv *drv = mbadrv(io->i_adapt, unit); | |
99fe9747 | 29 | register struct pte *pte = mba->mba_map; |
1e07c79f KB |
30 | unsigned int v; |
31 | int npf, o, vaddr; | |
6810489f | 32 | |
6810489f BJ |
33 | v = btop(io->i_ma); |
34 | o = (int)io->i_ma & PGOFSET; | |
35 | npf = btoc(io->i_cc + o); | |
99fe9747 | 36 | vaddr = o; |
6810489f BJ |
37 | while (--npf >= 0) |
38 | *(int *)pte++ = v++ | PG_V; | |
99fe9747 BJ |
39 | mba->mba_sr = -1; |
40 | mba->mba_bcr = -io->i_cc; | |
41 | mba->mba_var = vaddr; | |
5b34c67b | 42 | if (io->i_flgs&F_SSI) |
ac670a09 | 43 | drv->mbd_of |= HPOF_SSEI; |
514820ed HS |
44 | switch (io->i_flgs & F_TYPEMASK) { |
45 | ||
46 | case F_RDDATA: /* standard read */ | |
47 | drv->mbd_cs1 = MB_RCOM|MB_GO; | |
1e07c79f | 48 | mbawait(io, unit); |
514820ed HS |
49 | return(0); |
50 | ||
51 | case F_WRDATA: /* standard write */ | |
52 | drv->mbd_cs1 = MB_WCOM|MB_GO; | |
1e07c79f | 53 | mbawait(io, unit); |
514820ed HS |
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: | |
5b34c67b | 77 | goto error; |
514820ed | 78 | } |
1e07c79f | 79 | mbawait(io, unit); |
514820ed HS |
80 | if ((drv->mbd_dt & MBDT_TAP) == 0) |
81 | return (0); | |
5b34c67b SL |
82 | error: |
83 | io->i_error = ECMD; | |
84 | io->i_flgs &= ~F_TYPEMASK; | |
85 | return (1); | |
6810489f | 86 | } |
56a904c5 | 87 | |
1e07c79f | 88 | mbawait(io, unit) |
5f8a4923 | 89 | register struct iob *io; |
1e07c79f | 90 | int unit; |
5f8a4923 | 91 | { |
1e07c79f KB |
92 | struct mba_regs *mba = mbamba(io->i_adapt); |
93 | struct mba_drv *drv = mbadrv(io->i_adapt, unit); | |
5f8a4923 SL |
94 | |
95 | while (mba->mba_sr & MBSR_DTBUSY) | |
96 | DELAY(100); | |
97 | } | |
98 | ||
56a904c5 BJ |
99 | mbainit(mbanum) |
100 | int mbanum; | |
101 | { | |
99152021 | 102 | register struct mba_regs *mba; |
56a904c5 | 103 | |
99152021 MK |
104 | if (mbanum >= nmba) |
105 | return (0); | |
106 | mba = mbaddr[mbanum]; | |
0187d43c | 107 | if (badaddr((char *)mba, sizeof(long))) |
80c81fbf | 108 | return (0); |
39c71180 MK |
109 | if ((mbaact & (1<<mbanum)) == 0) { |
110 | mba->mba_cr = MBCR_INIT; | |
111 | mbaact |= 1<<mbanum; | |
112 | } | |
80c81fbf | 113 | return (1); |
56a904c5 | 114 | } |