|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986, 1988 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 7.8 (Berkeley) 4/4/90
7: */
8:
9: #include "machine/pte.h"
10:
11: #include "param.h"
12: #include "vm.h"
13:
14: #include "../vax/mtpr.h"
15: #include "../vaxmba/mbareg.h"
16: #include "../vaxmba/hpreg.h"
17:
18: #include "saio.h"
19: #include "savax.h"
20:
21: mbastart(io, unit, func)
22: register struct iob *io;
23: int unit, func;
24: {
25: struct mba_regs *mba = mbamba(io->i_adapt);
26: struct mba_drv *drv = mbadrv(io->i_adapt, unit);
27: register struct pte *pte = mba->mba_map;
28: unsigned int v;
29: int npf, o, vaddr;
30:
31: v = btop(io->i_ma);
32: o = (int)io->i_ma & PGOFSET;
33: npf = btoc(io->i_cc + o);
34: vaddr = o;
35: while (--npf >= 0)
36: *(int *)pte++ = v++ | PG_V;
37: mba->mba_sr = -1;
38: mba->mba_bcr = -io->i_cc;
39: mba->mba_var = vaddr;
40: if (io->i_flgs&F_SSI)
41: drv->mbd_of |= HPOF_SSEI;
42: switch (io->i_flgs & F_TYPEMASK) {
43:
44: case F_RDDATA: /* standard read */
45: drv->mbd_cs1 = MB_RCOM|MB_GO;
46: mbawait(io, unit);
47: return(0);
48:
49: case F_WRDATA: /* standard write */
50: drv->mbd_cs1 = MB_WCOM|MB_GO;
51: mbawait(io, unit);
52: return(0);
53:
54: /* the following commands apply to disks only */
55:
56: case F_HDR|F_RDDATA:
57: drv->mbd_cs1 = HP_RHDR|HP_GO;
58: break;
59:
60: case F_HDR|F_WRDATA:
61: drv->mbd_cs1 = HP_WHDR|HP_GO;
62: break;
63:
64: case F_CHECK|F_WRDATA:
65: case F_CHECK|F_RDDATA:
66: drv->mbd_cs1 = HP_WCDATA|HP_GO;
67: break;
68:
69: case F_HCHECK|F_WRDATA:
70: case F_HCHECK|F_RDDATA:
71: drv->mbd_cs1 = HP_WCHDR|HP_GO;
72: break;
73:
74: default:
75: goto error;
76: }
77: mbawait(io, unit);
78: if ((drv->mbd_dt & MBDT_TAP) == 0)
79: return (0);
80: error:
81: io->i_error = ECMD;
82: io->i_flgs &= ~F_TYPEMASK;
83: return (1);
84: }
85:
86: mbawait(io, unit)
87: register struct iob *io;
88: int unit;
89: {
90: struct mba_regs *mba = mbamba(io->i_adapt);
91: struct mba_drv *drv = mbadrv(io->i_adapt, unit);
92:
93: while (mba->mba_sr & MBSR_DTBUSY)
94: DELAY(100);
95: }
96:
97: mbainit(mbanum)
98: int mbanum;
99: {
100: register struct mba_regs *mba;
101:
102: if (mbanum >= nmba)
103: return (0);
104: mba = mbaddr[mbanum];
105: if (badaddr((char *)mba, sizeof(long)))
106: return (0);
107: if ((mbaact & (1<<mbanum)) == 0) {
108: mba->mba_cr = MBCR_INIT;
109: mbaact |= 1<<mbanum;
110: }
111: return (1);
112: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.