|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986 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.1 (Berkeley) 6/5/86
7: */
8:
9: #include "../machine/pte.h"
10:
11: #include "../h/param.h"
12: #include "../h/inode.h"
13: #include "../h/fs.h"
14: #include "../h/vm.h"
15:
16: #include "../vax/mtpr.h"
17: #include "../vaxmba/mbareg.h"
18: #include "../vaxmba/hpreg.h"
19:
20: #include "saio.h"
21: #include "savax.h"
22:
23: mbastart(io, func)
24: register struct iob *io;
25: int func;
26: {
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;
30: int npf;
31: unsigned v;
32: int o;
33: int vaddr;
34:
35: v = btop(io->i_ma);
36: o = (int)io->i_ma & PGOFSET;
37: npf = btoc(io->i_cc + o);
38: vaddr = o;
39: while (--npf >= 0)
40: *(int *)pte++ = v++ | PG_V;
41: mba->mba_sr = -1;
42: mba->mba_bcr = -io->i_cc;
43: mba->mba_var = vaddr;
44: if (io->i_flgs&F_SSI)
45: drv->mbd_of |= HPOF_SSEI;
46: switch (io->i_flgs & F_TYPEMASK) {
47:
48: case F_RDDATA: /* standard read */
49: drv->mbd_cs1 = MB_RCOM|MB_GO;
50: mbawait(io);
51: return(0);
52:
53: case F_WRDATA: /* standard write */
54: drv->mbd_cs1 = MB_WCOM|MB_GO;
55: mbawait(io);
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:
79: goto error;
80: }
81: mbawait(io);
82: if ((drv->mbd_dt & MBDT_TAP) == 0)
83: return (0);
84: error:
85: io->i_error = ECMD;
86: io->i_flgs &= ~F_TYPEMASK;
87: return (1);
88: }
89:
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:
100: mbainit(mbanum)
101: int mbanum;
102: {
103: register struct mba_regs *mba = mbaddr[mbanum];
104:
105: /* SHOULD BADADDR IT */
106: if (mbaact & (1<<mbanum))
107: return;
108: mba->mba_cr = MBCR_INIT;
109: mbaact |= 1<<mbanum;
110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.