|
|
1.1 root 1: /* mba.c 6.1 83/07/29 */
2:
3: #include "../machine/pte.h"
4:
5: #include "../h/param.h"
6: #include "../h/inode.h"
7: #include "../h/fs.h"
8: #include "../h/vm.h"
9:
10: #include "../vax/mtpr.h"
11: #include "../vaxmba/mbareg.h"
12: #include "../vaxmba/hpreg.h"
13:
14: #include "saio.h"
15: #include "savax.h"
16:
17: mbastart(io, func)
18: register struct iob *io;
19: int func;
20: {
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;
24: int npf;
25: unsigned v;
26: int o;
27: int vaddr;
28:
29: v = btop(io->i_ma);
30: o = (int)io->i_ma & PGOFSET;
31: npf = btoc(io->i_cc + o);
32: vaddr = o;
33: while (--npf >= 0)
34: *(int *)pte++ = v++ | PG_V;
35: mba->mba_sr = -1;
36: mba->mba_bcr = -io->i_cc;
37: mba->mba_var = vaddr;
38: if (io->i_flgs&F_SSI)
39: drv->mbd_of |= HPOF_SSEI;
40: switch (io->i_flgs & F_TYPEMASK) {
41:
42: case F_RDDATA: /* standard read */
43: drv->mbd_cs1 = MB_RCOM|MB_GO;
44: mbawait(io);
45: return(0);
46:
47: case F_WRDATA: /* standard write */
48: drv->mbd_cs1 = MB_WCOM|MB_GO;
49: mbawait(io);
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:
73: goto error;
74: }
75: mbawait(io);
76: if ((drv->mbd_dt & MBDT_TAP) == 0)
77: return (0);
78: error:
79: io->i_error = ECMD;
80: io->i_flgs &= ~F_TYPEMASK;
81: return (1);
82: }
83:
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:
94: mbainit(mbanum)
95: int mbanum;
96: {
97: register struct mba_regs *mba = mbaddr[mbanum];
98:
99: /* SHOULD BADADDR IT */
100: if (mbaact & (1<<mbanum))
101: return;
102: mba->mba_cr = MBCR_INIT;
103: mbaact |= 1<<mbanum;
104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.