Commit | Line | Data |
---|---|---|
55b4dbd0 KM |
1 | /* |
2 | * Copyright (c) 1982 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 6.2 (Berkeley) %G% | |
7 | */ | |
faeec66d SL |
8 | |
9 | #include "../machine/pte.h" | |
6810489f BJ |
10 | |
11 | #include "../h/param.h" | |
12 | #include "../h/inode.h" | |
b5d17f4d | 13 | #include "../h/fs.h" |
6810489f | 14 | #include "../h/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 | |
99fe9747 BJ |
23 | mbastart(io, func) |
24 | register struct iob *io; | |
25 | int func; | |
6810489f | 26 | { |
99fe9747 BJ |
27 | struct mba_regs *mba = mbamba(io->i_unit); |
28 | struct mba_drv *drv = mbadrv(io->i_unit); | |
29 | register struct pte *pte = mba->mba_map; | |
6810489f BJ |
30 | int npf; |
31 | unsigned v; | |
6810489f BJ |
32 | int o; |
33 | int vaddr; | |
6810489f | 34 | |
6810489f BJ |
35 | v = btop(io->i_ma); |
36 | o = (int)io->i_ma & PGOFSET; | |
37 | npf = btoc(io->i_cc + o); | |
99fe9747 | 38 | vaddr = o; |
6810489f BJ |
39 | while (--npf >= 0) |
40 | *(int *)pte++ = v++ | PG_V; | |
99fe9747 BJ |
41 | mba->mba_sr = -1; |
42 | mba->mba_bcr = -io->i_cc; | |
43 | mba->mba_var = vaddr; | |
5b34c67b | 44 | if (io->i_flgs&F_SSI) |
ac670a09 | 45 | drv->mbd_of |= HPOF_SSEI; |
514820ed HS |
46 | switch (io->i_flgs & F_TYPEMASK) { |
47 | ||
48 | case F_RDDATA: /* standard read */ | |
49 | drv->mbd_cs1 = MB_RCOM|MB_GO; | |
5f8a4923 | 50 | mbawait(io); |
514820ed HS |
51 | return(0); |
52 | ||
53 | case F_WRDATA: /* standard write */ | |
54 | drv->mbd_cs1 = MB_WCOM|MB_GO; | |
5f8a4923 | 55 | mbawait(io); |
514820ed HS |
56 | return(0); |
57 | ||
58 | /* the following commands apply to disks only */ | |
59 | ||
60 | case F_HDR|F_RDDATA: | |
61 | drv->mbd_cs1 = HP_RHDR|HP_GO; | |
62 | break; | |
63 | ||
64 | case F_HDR|F_WRDATA: | |
65 | drv->mbd_cs1 = HP_WHDR|HP_GO; | |
66 | break; | |
67 | ||
68 | case F_CHECK|F_WRDATA: | |
69 | case F_CHECK|F_RDDATA: | |
70 | drv->mbd_cs1 = HP_WCDATA|HP_GO; | |
71 | break; | |
72 | ||
73 | case F_HCHECK|F_WRDATA: | |
74 | case F_HCHECK|F_RDDATA: | |
75 | drv->mbd_cs1 = HP_WCHDR|HP_GO; | |
76 | break; | |
77 | ||
78 | default: | |
5b34c67b | 79 | goto error; |
514820ed | 80 | } |
5f8a4923 | 81 | mbawait(io); |
514820ed HS |
82 | if ((drv->mbd_dt & MBDT_TAP) == 0) |
83 | return (0); | |
5b34c67b SL |
84 | error: |
85 | io->i_error = ECMD; | |
86 | io->i_flgs &= ~F_TYPEMASK; | |
87 | return (1); | |
6810489f | 88 | } |
56a904c5 | 89 | |
5f8a4923 SL |
90 | mbawait(io) |
91 | register struct iob *io; | |
92 | { | |
93 | struct mba_regs *mba = mbamba(io->i_unit); | |
94 | struct mba_drv *drv = mbadrv(io->i_unit); | |
95 | ||
96 | while (mba->mba_sr & MBSR_DTBUSY) | |
97 | DELAY(100); | |
98 | } | |
99 | ||
56a904c5 BJ |
100 | mbainit(mbanum) |
101 | int mbanum; | |
102 | { | |
99fe9747 | 103 | register struct mba_regs *mba = mbaddr[mbanum]; |
56a904c5 | 104 | |
99fe9747 BJ |
105 | /* SHOULD BADADDR IT */ |
106 | if (mbaact & (1<<mbanum)) | |
107 | return; | |
108 | mba->mba_cr = MBCR_INIT; | |
56a904c5 BJ |
109 | mbaact |= 1<<mbanum; |
110 | } |