conservative fix for increasing FIN
[unix-history] / usr / src / sys / vax / stand / mba.c
CommitLineData
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
23mbastart(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
84error:
85 io->i_error = ECMD;
86 io->i_flgs &= ~F_TYPEMASK;
87 return (1);
6810489f 88}
56a904c5 89
5f8a4923
SL
90mbawait(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
100mbainit(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}